0

2D ポインターを含む構造体をホストからデバイスにコピーすることに関連する質問があります。私のコードは次のとおりです。

struct mymatrix
    {
        matrix m;
        int x;
    };
size_t pitch;

mymatrix m_h[5];
for(int i=0; i<5;i++){
    m_h[i].m = (float**) malloc(4 * sizeof(float*));  
       for (int idx = 0; idx < 4; ++idx)
           {
               m_h[i].m[idx] = (float*)malloc(4 * sizeof(float));
           }
       }
mymatrix *m_hh = (mymatrix*)malloc(5*sizeof(mymatrix));
memcpy(m_hh,m_h,5*sizeof(mymatrix));

for(int i=0 ; i<5 ;i++) 
{
     cudaMallocPitch((void**)&(m_hh[i].m),&pitch,4*sizeof(float),4);
     cudaMemcpy2D(m_hh[i].m, pitch, m_h[i].m, 4*sizeof(float), 4*sizeof(float),4,cudaMemcpyHostToDevice);
}
mymatrix *m_d;
cudaMalloc((void**)&m_d,5*sizeof(mymatrix));
cudaMemcpy(m_d,m_hh,5*sizeof(mymatrix),cudaMemcpyHostToDevice);
distance_calculation_begins<<<1,16>>>(m_d,pitch);

問題

このコードでは、構造体の 2D ポインター要素にアクセスできませんがx、デバイス内のその構造体からアクセスできます。たとえば、mymatrix* m 初期化するとポインタで m_d を受け取るなど

m[0].m[0][0] = 5;

そして、この値を次のように出力します

cuPrintf("The value is %f",m[0].m[0][0]);

デバイスでは、出力が得られません。2Dポインターを使用できないことを意味しますが、アクセスしようとすると

 m[0].x = 5; 

それから私はこれを印刷することができます。初期化は正しいと思いますが、問題がわかりません。誰からの助けも大歓迎です。

4

2 に答える 2