Templates CUDA模板化函数调用

Templates CUDA模板化函数调用,templates,cuda,runtime-error,runtime,Templates,Cuda,Runtime Error,Runtime,这个运行时错误已经困扰了我两天,我尝试了所有可能的方法来调试它,但我仍然找不到问题所在 #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__,

这个运行时错误已经困扰了我两天,我尝试了所有可能的方法来调试它,但我仍然找不到问题所在

#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() */
}
此外,当插件键值对为int-double时,例如

KernelDriver<int, double>((int *)key, (double *)value, n, h_histo, h_prefix, agg);

它一点错误都没有,运行得非常好。我试着在主机和设备上打印SizeFlong,它们都是8字节。现在,我不知道这个问题是什么。

我只是自己找到了解决办法。不同的机器在字节长度上有不同的大小,有些机器是4字节,有些是8字节。确保它们是在编译器和体系结构中编译的,否则,cudaMemcpy将无法复制两个不同大小的内存块

要诊断运行时错误,需要一个,但您未能提供。请编辑您的问题,以包含其他人可以编译、运行和重现您的错误的代码
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).
KernelDriver<int, double>((int *)key, (double *)value, n, h_histo, h_prefix, agg);