新推力::制表功能适用于主机但不适用于设备。该设备是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接受之前是必需的:大部分程序都是错误检查和版本检查。
答案 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中修复了这些问题,我会感到惊讶。
关于制表问题的进一步说明:
thrust::tabulate
。我测试的许多推力函数似乎都失败了,当与thrust::device
和原始指针一起使用时,它们无法正确写入值(似乎写入全零),但它们似乎能够正确读取值(例如thrust::reduce
似乎有效)thrust::device_ptr<>
使用thrust::device_ptr_cast<>()
包装原始指针。这对我来说似乎也有用。