2011-06-24 19 views
1

これは私のコードです。行列d_refを初期化してデバイスにコピーします。私が正しくcudaMallocPitchとcudaMemcpy2Dを使用している場合、私はわからないが、私はcudaMemcpy2Dを使用しようと、私は出力に入る私はCUDAでcudaMallocPitchとcudaMemcpy2Dを使用していますが、正しい答えは得られません!

すべてCUDA programming guideの下の20ページには、私のコードで間違って何0

のですか?この仕事をする最良の方法ですか?

ありがとうございます。

__host__  

float *d_ref; 

float **h_ref = new float* [width]; 
for (int i=0;i<width;i++) 
    h_ref[i]= new float [height]; 

for (int i=0;i<width;i++){ 
    for (int j=0;j<height;j++){ 
     h_ref[i][j]=ref_list[j][i]; //transpose 
    } 
} 

size_t ref_pitch; 

cudaMallocPitch(&d_ref, &ref_pitch, width * sizeof(float), height); 

cudaMemcpy2D(d_ref, ref_pitch, h_ref, width*sizeof(float),width*sizeof(float), height*sizeof(float), cudaMemcpyHostToDevice); 


lowerBound<<<grid, block>>>(d_ref, ... 




__global__ void lowerBound (float* d_ref, .... 


    float* ref = (float*)((char*)d_ref + blockIdx.x * ref_pitch); 

    cuPrintf(" %f \n",ref[threadIdx.x]); 

答えて

1

書き込まとしてcudaMemcpy2Dへの呼び出しは、実際に、それは「幅」ポインタの1Dアレイである場合H_REFは、連続して格納「幅」X「高」フロート要素の2次元アレイであることを前提としています。

行列を1次元のベクトルとして表現する代わりに、 'width' x 'height' floatの1次元配列に格納し、行、列に基づいてアクセスするためにマクロを使用することをお勧めします。この行に

+0

ありがとうございます!私はcudaMemcpy2Dのh_refの隣に星を追加して解決しました。 \t cudaMemcpy2D(d_ref、ref_pitch、* h_ref、width * sizeof(float)、width * sizeof(float)、hight、cudaMemcpyHostToDevice); – Kiarash

+0

href [i]によって指し示される個々の列ベクトルが連続して格納されるという保証はないので、コードを変更してもいつでも失敗する可能性があります。 – njuffa

+0

大丈夫です!私はまだそれに問題があります。どうやらそれは正しくコピーされません。配列の定義を動的から静的に変更しましたが、まだ動作していません。私は1Dへの変更が解決策であることを知っていますが、どのように私はcudaMallocPitchとcudaMemcpy2Dを使用できますか? 2Dでそれを行う方法があるはずです... – Kiarash

3

cudaMemcpy2D(のd_ref、ref_pitch、H_REF、幅*はsizeof(フロート)、幅*はsizeof(フロート)、高さ*はsizeof(フロート)、cudaMemcpyHostToDevice)。

なぜheightsizeof(float)を掛けていますか?あなたはあまりにも多くのデータを転送しています!

+0

True!パラメータの高さはバイト数ではなく、垂直方向の行数のみです – user562529

関連する問題