【问题标题】:cudaErrorInvalidValue (0n11)cudaErrorInvalidValue (0n11)
【发布时间】:2015-11-30 22:11:00
【问题描述】:

我有一个带有 CUDA 7.5 的 GTX 970,并以 5.2 的计算能力进行编译。当我使用以下尺寸运行此内核时,我得到 cudaErrorInvalidValue。这些尺寸对这个内核有效还是我错过了其他东西?

dim3 blockDim(4, 4, 4);
dim3 gridDim((width + blockDim.z - 1)/ blockDim.z,
                 (height + blockDim.y - 1) / blockDim.y,
                 (depth + blockDim.z - 1) / blockDim.z);
icabsm_kernel<<<gridDim, blockDim>>>(threeDim,
                                           b_count,
                                           width,
                                           height,
                                           depth,
                                           dev_md,
                                           dev_d0,
                                           dev_d1,
                                           dev_num_fibers,
                                           dev_fr,
                                           dev_fib_fa,
                                           dev_fib_dir,
                                           dev_g_dg,
                                           dev_invg_dg,
                                           dev_signalData);
cudaError_t err = cudaGetLastError();
if(err != cudaSuccess)
    printf("Error: %s\n", cudaGetErrorString(err));
cudaDeviceSynchronize();

宽度 = 96,高度 = 96,深度 = 72, 我得到了:

blockDim = {4, 4, 4}
gridDim = {24, 24, 18}

附言。我已经查看了所有其他解决方案,但在我的情况下都没有任何意义。 提前致谢。

更新:在我上次的 cudaMalloc 中,我忘记将大小乘以 sizeof(float) 并且 cudaMemcpy 说大小不匹配!愚蠢的我。

【问题讨论】:

    标签: cuda nvidia


    【解决方案1】:

    这些尺寸对这个内核有效还是我遗漏了其他东西?

    这些维度本身不应在内核启动时产生任何错误。

    这是一个完整的例子:

    $ cat t19.cu
    #include <stdio.h>
    
    __global__ void tkernel(){
    
      if ((!threadIdx.x) && (!threadIdx.y) && (!threadIdx.z) && (!blockIdx.x) && (!blockIdx.y) && (!blockIdx.z)) 
        printf("hello from kernel\n");
    }
    
    int main(){
    
      int width = 96;
      int height = 96;
      int depth = 72;
      dim3 blockDim(4, 4, 4);
      dim3 gridDim((width + blockDim.z - 1)/ blockDim.z,
                     (height + blockDim.y - 1) / blockDim.y,
                     (depth + blockDim.z - 1) / blockDim.z);
    
      tkernel<<<gridDim, blockDim>>>();
      cudaError_t err = cudaGetLastError();
      if(err != cudaSuccess)
        printf("Error1: %s\n", cudaGetErrorString(err));
      cudaDeviceSynchronize();
      err = cudaGetLastError();
      if(err != cudaSuccess)
        printf("Error2: %s\n", cudaGetErrorString(err));
    }
    $ nvcc -o t19 t19.cu -arch=sm_52
    $ cuda-memcheck ./t19
    ========= CUDA-MEMCHECK
    hello from kernel
    ========= ERROR SUMMARY: 0 errors
    $
    

    你的问题在于你没有展示的东西。

    【讨论】:

    • 看了你的代码后,我决定在内核启动之前进行错误检查,确实错误是针对之前的 cuda 调用。感谢您的答复。吸取教训!!!!!!
    猜你喜欢
    • 1970-01-01
    • 2011-03-06
    • 2012-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多