cudaErrorInvalidValue(0n11)

时间:2015-11-30 22:11:01

标签: cuda nvidia

我有一台带有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}

PS。我看过所有其他解决方案,在我的案例中都没有意义。 提前谢谢。

更新:在我上一次的cudaMalloc中,我忘了将sizeof乘以sizeof(float),cudaMemcpy说这些尺寸不匹配!!愚蠢的我。

1 个答案:

答案 0 :(得分:0)

  

这些维度对此内核有效还是我遗漏了其他内容?

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

这是一个完整的例子:

$ 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
$

你的问题在于你没有表现出来的东西。