CUDA设备上的推力1.7制表失败
新的推力::制表功能在主机上适用,但在设备上不适用。该设备为K20x,计算能力为3.5。主机是一台具有128GB内存的Ubuntu机器。帮忙 我认为统一寻址不是问题,因为我可以在设备上对统一寻址的数组进行排序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>
#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__