这个运行时错误困扰了我两天,我尝试了所有可能的调试方法,但仍然找不到问题所在。
#define CUDA_RT_CALL( call ){
cudaError_t cudaStatus = call;
if ( cudaSuccess != cudaStatus )
fprintf(stderr, "ERROR: CUDA RT call \"%s\" in line %d of file %s failed with %s (%d).\n",
#call, __LINE__, __FILE__, cudaGetErrorString(cudaStatus), cudaStatus);
}
template <typename Tkey, typename Tvalue>
void KernelDriver(Tkey * K, Tvalue * V, int N, long * h_h, long * h_p, int A){
Tkey * d_keys_in;
Tvalue * d_values_in;
CUDA_RT_CALL(cudaMalloc((void**)&d_keys_in, sizeof(Tkey)*N));
CUDA_RT_CALL(cudaMalloc((void**)&d_values_in, sizeof(Tvalue)*N));
CUDA_RT_CALL(cudaMemcpy(d_keys_in, K, sizeof(Tkey)*N, cudaMemcpyHostToDevice));
CUDA_RT_CALL(cudaMemcpy(d_values_in, V, sizeof(Tvalue)*N, cudaMemcpyHostToDevice));
/* myKernel() */
}
以上代码,可正常编译。但是,当我运行已编译的cuda程序时,只要键值对是int-long,即
KernelDriver<int, long>((int *)key, (long *)value, n, h_histo, h_prefix, agg);
CUDA运行时API报告错误:
ERROR: CUDA RT call "cudaMemcpy(d_values_in, V, sizeof(Tvalue)*N, cudaMemcpyHostToDevice)" in line 295 of file gpucode.cu failed with invalid argument (11).
此外,当插件键值对为int-double时,例如
KernelDriver<int, double>((int *)key, (double *)value, n, h_histo, h_prefix, agg);
它完全没有错误,并且运行良好。我试图在主机和设备上打印sizeof(long),它们都是8个字节。现在,我不知道这个问题是什么。
答案 0 :(得分:0)
我只是自己找到解决方案。不同的机器对于“ long”具有不同的字节大小,其中一些机器为4字节,其中一些为8字节。确保它们在编译器和体系结构中进行了编译,否则,cudaMemcpy将无法复制两个不同的块大小的内存。