0

そのため、それぞれがデバイス上の構造体を指しているポインターのリストを割り当てようとしていますが、segfault が発生し続けます。これは通常のmallocでは問題なく動作しますが、 では問題が発生しcudaMallocます。

struct body //struct holding information for one body
    {
        int id;
        float m;                    //mass
        float a[3];             //acceleration
        float v[3];             //velocity
        float pos[3];            //x, y, z
    } ;

body** devBodies;
cudaMalloc( (void**)&devBodies, n * sizeof(body*) );

for(i = 0; i < n; i++)
    {
        cudaMalloc( (void**)&devBodies[i], sizeof(body));
    }

リスト内の各ポインターが構造体を指すようにします。なぜこれが機能しないのですか?

4

2 に答える 2

3

これはdevBodies[i]、デバイス メモリに保存され、ホストから直接書き込みできないため、機能していません。したがって、内部cudaMalloc呼び出しは失敗しています。

devBodies解決策は、ホストメモリ内の内容をアセンブルし、それをデバイスにコピーすることです。コード スニペットは次のようになります。

struct body //struct holding information for one body
    {
        int id;
        float m;                //mass
        float a[3];             //acceleration
        float v[3];             //velocity
        float pos[3];           //x, y, z
    } ;

body** devBodies;
body** _devBodies = new body*[n]; // shadow copy of devBodies

cudaMalloc( (void**)&devBodies, n * sizeof(body*) );

for(i = 0; i < n; i++){
    cudaMalloc( (void**)&_devBodies[i], sizeof(body));
}

cudaMemcpy(devBodies, _devBodies, n * sizeof(body*));

_devBodies次に、の内容を使用してホスト側 API に渡す必要があることに注意してください。

原則として、このタイプのポインター配列は、GPU コンピューティングにはあまり適していません。ホスト上のセットアップ コードは不必要に複雑であり、デバイス上のパフォーマンスはフラット メモリよりも劣ります。これは、データへのアクセスに必要なポインタの間接化がすべて追加されるためです。

于 2014-04-18T11:25:43.803 に答える
1

あなたが達成しようとしていることを見ると、多くの構造体 (より具体的には structs ) を作成しているようですn

次のことができない理由はありますか?

struct body //struct holding information for one body
    {
        int id;
        float m;                    //mass
        float a[3];             //acceleration
        float v[3];             //velocity
        float pos[3];            //x, y, z
    } ;

body* devBodies;
cudaMalloc( (void*)&devBodies, n * sizeof(body) );
于 2014-04-18T12:46:15.120 に答える