0

みんな、おはよう

スラストを研究するときに、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

どうしたの?

4

1 に答える 1

1

デバイスがユニファイド アドレッシングをサポートしているかどうかに依存すると思います。それ以外の場合は、他の GPU からメモリにアクセスするために、最初に GPUdirect から cudaPeerRegister を呼び出す必要があります。

これは、2 番目のデバイスから cudaDeviceCanAccessPeer() を使用して確認できます。また、cudaGetDeviceProperties() を呼び出して、unifiedAddressing フィールドを確認することもできます。

PS。4 つの Tesla S2050 GPU を搭載したマシンでコードを確認したところ、cudaDeviceCanAccessPeer() が 0 を返すため、直接アクセスが機能しません。

于 2012-08-21T10:43:07.073 に答える