cudaErrorInvalidValue (0n11)
cudaErrorInvalidValue (0n11)
我有一个带有 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(float) 并且 cudaMemcpy 说大小不匹配!!愚蠢的我。
Are these dimensions valid for this kernel or am I missing something else?
这些维度本身不应在内核启动时产生任何错误。
这是一个完整的示例:
$ 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 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(float) 并且 cudaMemcpy 说大小不匹配!!愚蠢的我。
Are these dimensions valid for this kernel or am I missing something else?
这些维度本身不应在内核启动时产生任何错误。
这是一个完整的示例:
$ 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
$
你的问题出在你没有表现出来。