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