早上大家
我想在研究推力时测试p2p内存访问。但是有些不对劲。
测试代码如下:
#include <iostream>
#include <thrust/device_vector.h>
#include <thrust/transform.h>
#include <thrust/functional.h>
using namespace std;
void test(thrust::device_vector<int> &Vec)
{
try{
thrust::negate<int> op;
thrust::transform(Vec.begin(),Vec.end(),Vec.begin(),op);
}catch(thrust::system::system_error &e)
{
cerr<<"Something wrong: "<<e.what()<<endl;
}
}
int main()
{
cudaSetDevice(0);
thrust::device_vector<int> Vec(5);
for(int i=0;i<5;i++)
{
Vec[i]=i;
cout<<i<<" ";
}
cout<<endl;
int TID=1;
cudaSetDevice(TID);
cudaDeviceEnablePeerAccess(0,0);
test(Vec);
for(int i=0;i<5;i++)
cout<<Vec[i]<<" ";
cout<<endl;
return 0;
}
我执行此代码,它给了我错误信息。
terminate called after throwing an instance of 'thrust::system::system_error'
what(): invalid device pointer
Aborted
发生了什么事?
答案 0 :(得分:1)
我认为这取决于您的设备是否支持统一寻址,否则您必须先从GPUdirect调用cudaPeerRegister才能从其他GPU访问内存。
您可以使用第二台设备上的cudaDeviceCanAccessPeer()进行检查。 您也可以调用cudaGetDeviceProperties()并检查unifiedAddressing字段。
PS。我刚用4台Tesla S2050 GPU检查了你的代码 对我来说,cudaDeviceCanAccessPeer()返回0,因此直接访问不起作用..