我正在尝试使用 CUDA 驱动程序 API 启动内核。具体我打电话
CUresult CUDAAPI cuLaunchKernel(
CUfunction f,
unsigned int gridDimX, unsigned int gridDimY, unsigned int gridDimZ,
unsigned int blockDimX, unsigned int blockDimY, unsigned int blockDimZ,
unsigned int sharedMemBytes,
CUstream hStream,
void **kernelParams,
void **extra);
我只使用
kernelParams
,并通过 nullptr
代替 extra
。现在,对于我的一个内核,我得到 CUDA_ERROR_INVALID_VALUE
。
文档说:
如果同时使用
和CUDA_ERROR_INVALID_VALUE
指定内核参数(即kernelParams
和extra
都为非kernelParams
),将返回错误extra
。NULL
好吧,我不会那样做,但我仍然得到
CUDA_ERROR_INVALID_VALUE
。为了更加安全,我在启动内核之前同步了流 - 但没有成功。
尝试启动时获得
CUDA_ERROR_INVALID_VALUE
的其他原因是什么?
显然,在涉及
CUDA_ERROR_INVALID_VALUE
和/或 kernelParams
参数问题的多种情况下,您可能会收到 extras
错误:
kernelParams
和extras
都为空,但内核接受参数。kernelParams
和extras
都是非空的(这是官方记录的)kernelParams
值之前 nullptr
中的元素数量与内核参数的数量不匹配。这并不是一份详尽的清单。可能误用
extras
也会导致这种情况。
您可以参考https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#features-and-technical-specifications。请注意,线程块网格的最大 y 或 z 维度为 65535。
每个块的最大线程数为 1024。这意味着 x * y * z 不能 > 1024