You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
This repository has been archived by the owner on Jan 24, 2024. It is now read-only.
F0328 08:07:48.080608 588260 nvrtc_util.cc:107] Check failed: compile_res == NVRTC_SUCCESS (6 vs. 0)
default_program(21): error: argument of type "const double *" is incompatible with parameter of type "const float *"
在编写单测的过程中,由于单测编写人员疏忽,设置错误的 index,超过了合理的范围。报错信息将在 cuda module 里面抛出,未能及时发现是单测本身存在的问题导致数组越界的发生,单测编写人员甚至不知道 unspecified launch failure 是什么原因造成的。
# core dumped: cuda_module.cc:118] RAW: The error `CUDA_ERROR_LAUNCH_FAILED` occurs
# while compiling the ptx! And its message is `unspecified launch failure`.
简介
在编写了一段时间 CINN 算子单测之后,发现 CINN 存在如下的问题。
问题
External Call 机制
正确性问题
将指针传递给 External Function,导致了 inline compute 的错误和算子融合的错误。
性能问题
部分生成的 CUDA kernel 只使用了一个 block,几乎是单线程模式。
以 sort 算子为例子:#1411
对于 128 个元素的数组,生成的 CUDA kernel 如下。这种问题并非 External Call 机制所直接造成,kernel 限定使用一个 block 恰恰是 External Call 机制对数据依赖分析正确的结果。算子编写人员在使用 External Call 机制未能意识到最终生成的 kernel 无法充分利用 GPU 特性,算法设计上存在缺陷,调度优化也无能为力。
数据类型支持不完整
数据类型支持不完整,相关的修改有很多,这里就简单列举几个:
#1301
#1312
#1500
运行过程会抛出以下错误:
其修改方法比较简单:
cinn/runtime/cuda/cinn_cuda_runtime_source.cuh
编写并实现 kernelcinn/runtime/cuda/cuda_intrinsics.cc
注册新的 Extern 函数cinn/runtime/cuda/cuda_instrinsics_float16.cc
注册新的 Extern 函数编译时间过长的问题
IR 构建过于复杂造成编译时间过程。
例如,在
cinn/hlir/pe/elementwise.h
中存在下面的代码片段,IR 语法树的复杂度和元素的个数成正比。存在这个问题的算子有:
报错信息位置
以 scatter_add 算子为例子:#1500
在编写单测的过程中,由于单测编写人员疏忽,设置错误的 index,超过了合理的范围。报错信息将在 cuda module 里面抛出,未能及时发现是单测本身存在的问题导致数组越界的发生,单测编写人员甚至不知道
unspecified launch failure
是什么原因造成的。调度代码冗余问题
cinn/hlir/op/op_util.cc
提供了常见的调度函数实现方式,在此之前编写的算子存在代码冗余。在cinn/hlir/op/contrib
中翻一翻,可以发现来自社区贡献的代码,重复编写了调度函数代码。LowerVec 返回多于一个 LoweredFunc
以 scatter 算子为例子:#1500
scatter 算子的实现中,会调用
pe::Transpose
生成一个转置后的张量,如果对多个张量创建 Stage,那么在LowerVec
后将返回两个LoweredFunc
,而后续过程只允许一个LoweredFunc
。目前对 IRSchedule 的过程理解不够深刻,未能理解其本质。
显存暴涨的问题
#1411
对于 sort 算子,在输入数组的大小大于 32K/64K 的情况下,kernel 中的 temp buffer 将会超过 stack size,抛出 CUDA ERROR。此外,该计算过程分配过多内存,输入数组越大,中间将占用越多显存。
该问题的原因不详,需要跟进分析。
未来工作
为了更好进行 CINN 单测,我认为有如下可改进的点:
The text was updated successfully, but these errors were encountered: