来自 cuLaunchKernel() 的意外 CUDA_ERROR_INVALID_VALUE

问题描述 投票:0回答:2

我正在尝试使用 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 cuda-driver
2个回答
1
投票

显然,在涉及

CUDA_ERROR_INVALID_VALUE
和/或
kernelParams
参数问题的多种情况下,您可能会收到
extras
错误:

  1. kernelParams
    extras
    都为空,但内核接受参数。
  2. kernelParams
    extras
    都是非空的(这是官方记录的)
  3. 终止
    kernelParams
    值之前
    nullptr
    中的元素数量与内核参数的数量不匹配。

这并不是一份详尽的清单。可能误用

extras
也会导致这种情况。


0
投票

您可以参考https://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html#features-and-technical-specifications。请注意,线程块网格的最大 y 或 z 维度为 65535。
每个块的最大线程数为 1024。这意味着 x * y * z 不能 > 1024

© www.soinside.com 2019 - 2024. All rights reserved.