点对点内存访问引发异常

时间:2012-08-21 06:14:52

标签: cuda gpu thrust

早上大家

我想在研究推力时测试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

发生了什么事?

1 个答案:

答案 0 :(得分:1)

我认为这取决于您的设备是否支持统一寻址,否则您必须先从GPUdirect调用cudaPeerRegister才能从其他GPU访问内存。

您可以使用第二台设备上的cudaDeviceCanAccessPeer()进行检查。 您也可以调用cudaGetDeviceProperties()并检查unifiedAddressing字段。

PS。我刚用4台Tesla S2050 GPU检查了你的代码 对我来说,cudaDeviceCanAccessPeer()返回0,因此直接访问不起作用..