推力1.7制表CUDA设备失败

时间:2014-03-06 15:46:38

标签: cuda thrust

新推力::制表功能适用于主机但不适用于设备。该设备是K20x,具有3.5的计算能力。主机是一台具有128GB内存的Ubuntu机器。帮助

我认为统一寻址不是问题,因为我可以在设备上对统一寻址的数组进行排序。

#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/execution_policy.h>
#include <thrust/tabulate.h> 
#include <thrust/version.h> 

using namespace std;

// Print an expression's name then its value, possible followed by a
// comma or endl.  Ex: cout << PRINTC(x) << PRINTN(y);
#define PRINT(arg)  #arg "=" << (arg)
#define PRINTC(arg)  #arg "=" << (arg) << ", "
#define PRINTN(arg)  #arg "=" << (arg) << endl

//   Execute an expression and check for CUDA errors.
#define CE(exp) {                       \
cudaError_t e; e = (exp);                       \
if (e != cudaSuccess) { \
   cerr << #exp << " failed at line " << __LINE__ << " with error " << cudaGetErrorString(e) << endl; \
   exit(1); \
} \
}

const int N(10);

int main(void) {
  int major = THRUST_MAJOR_VERSION;
  int minor = THRUST_MINOR_VERSION;
  cout << "Thrust v" << major << "." << minor 
   << ", CUDA_VERSION: " << CUDA_VERSION << ", CUDA_ARCH: " << __CUDA_ARCH__ 
   << endl;
  cout << PRINTN(N);
  cudaDeviceProp prop;
  cudaGetDeviceProperties(&prop, 0);
  if (!prop.unifiedAddressing) {
cerr << "Unified addressing not available." << endl;
exit(1);
  }
  cudaGetDeviceProperties(&prop, 0);
  if (!prop.canMapHostMemory) {
cerr << "Can't map host memory." << endl;
exit(1);
  }
  cudaSetDeviceFlags(cudaDeviceMapHost);

  int *p, *q;
  CE(cudaHostAlloc(&p, N*sizeof(int), cudaHostAllocMapped));
  CE(cudaHostAlloc(&q, N*sizeof(int), cudaHostAllocMapped));

  thrust::tabulate(thrust::host, p, p+N, thrust::negate<int>());
  thrust::tabulate(thrust::device, q, q+N, thrust::negate<int>());

  for (int i=0; i<N; i++) 
cout << PRINTC(i) << PRINTC(p[i]) << PRINTN(q[i]);
}

输出:

 Thrust v1.7, CUDA_VERSION: 6000, CUDA_ARCH: 0
 N=10
 i=0, p[i]=0, q[i]=0
 i=1, p[i]=-1, q[i]=0
 i=2, p[i]=-2, q[i]=0
 i=3, p[i]=-3, q[i]=0
 i=4, p[i]=-4, q[i]=0
 i=5, p[i]=-5, q[i]=0
 i=6, p[i]=-6, q[i]=0
 i=7, p[i]=-7, q[i]=0
 i=8, p[i]=-8, q[i]=0
 i=9, p[i]=-9, q[i]=0

以下内容不会在我的帖子中添加任何信息内容,但在stackoverflow接受之前是必需的:大部分程序都是错误检查和版本检查。

1 个答案:

答案 0 :(得分:2)

问题似乎在目前的推力master branch中已得到修复。该主分支目前将自己标识为Thrust v1.8。

我用CUDA 6RC运行你的代码(似乎是你正在使用的),我能够复制你的观察结果。

然后我更新到主分支,并从代码中删除了__CUDA_ARCH__宏,我得到了预期的结果(主机和设备列表匹配)。

请注意,根据programming guide,当__CUDA_ARCH__宏在设备代码编译器正在编译的代码中使用时,仅定义 。它在主机代码中正式未定义。因此,在主机代码中如下使用它是可以接受的:

#ifdef __CUDA_ARCH__

但不是因为你正在使用它。是的,我理解推力v1.7和推力大师在这方面的行为是不同的,但似乎(也)是一个推力问题,已在主分支中修复。

每当下一个版本的推力被合并到官方CUDA掉落中时,我预期这两个问题都将被修复。由于我们非常接近CUDA 6.0官方发布,如果在CUDA 6.0中修复了这些问题,我会感到惊讶。

关于制表问题的进一步说明:

  1. 一种解决方法是更新主力
  2. 在我的测试中,问题似乎并不特定于thrust::tabulate。我测试的许多推力函数似乎都失败了,当与thrust::device和原始指针一起使用时,它们无法正确写入值(似乎写入全零),但它们似乎能够正确读取值(例如thrust::reduce似乎有效)
  3. 另一种可行的解决方法是使用thrust::device_ptr<>使用thrust::device_ptr_cast<>()包装原始指针。这对我来说似乎也有用。