CUDA设备上的推力1.7制表失败

CUDA设备上的推力1.7制表失败,cuda,thrust,Cuda,Thrust,新的推力::制表功能在主机上适用,但在设备上不适用。该设备为K20x,计算能力为3.5。主机是一台具有128GB内存的Ubuntu机器。帮忙 我认为统一寻址不是问题,因为我可以在设备上对统一寻址的数组进行排序 #include <iostream> #include <thrust/device_vector.h> #include <thrust/execution_policy.h> #include <thrust/tabulate.h>

新的推力::制表功能在主机上适用,但在设备上不适用。该设备为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]);
}

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

目前,这个问题似乎已经解决了。此主分支当前将自己标识为推力v1.8

我用CUDA6RC运行了你的代码(似乎就是你正在使用的),我能够复制你的观察结果

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

请注意,根据,只有在设备代码编译器正在编译的代码中使用
\uuuuu CUDA\u ARCH\uuuu
宏时,才会定义该宏。它在主机代码中没有正式定义。因此,可以在主机代码中按如下方式使用它:

#ifdef __CUDA_ARCH__
但不是因为你在使用它。是的,我知道推力v1.7和推力主机在这方面的行为是不同的,但这似乎(也)是一个推力问题,已经在主机分支中修复

我希望这两个问题在下一个版本的推力被纳入CUDA官方版本时都会得到解决。由于我们离CUDA6.0正式发布非常近,如果这些问题在CUDA6.0中得到解决,我会感到惊讶

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

  • 一个解决办法是将推力更新为主推力
  • 在我的测试中,这个问题似乎不是特定于
    推力::制表
    。我测试过的许多推力函数在与
    推力::设备
    和原始指针一起使用时似乎失败了,它们无法正确写入值(似乎写入了所有的零),但它们似乎能够正确读取值(例如
    推力::减少
    似乎有效)
  • 另一种可能的解决方法是使用
    stress::device\u ptr
    使用
    stress::device\u ptr\u cast()
    将原始指针包装起来。这似乎对我也有用
  • #ifdef __CUDA_ARCH__