2016-06-11 8 views
-3

uint64_tのホスト配列はspectrum_sizeです。これを割り当ててGPUにコピーする必要があります。 しかし、これをGPUのメモリに割り当てようとしているが、SIGSEGVを受け取り続ける...アイデアは?CUDA割り当てのSIGSEGV

uint64_t * gpu_hashed_spectrum; 
    uint64_t * gpu_hashed_spectrum_h = new uint64_t [spectrum_size]; 
    HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum, sizeof(uint64_t *) * spectrum_size)); 
    for(i=0; i<spectrum_size; i++) { 
     HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum_h[i], sizeof(uint64_t))); 
    } 
    printf("\t\t...Copying\n"); 
    for(i=0; i<spectrum_size; i++) { 
     HANDLE_ERROR(cudaMemcpy((void *)gpu_hashed_spectrum_h[i], (const void *)hashed_spectrum[i], sizeof(uint64_t), cudaMemcpyHostToDevice)); 
    } 
    HANDLE_ERROR(cudaMemcpy(gpu_hashed_spectrum, gpu_hashed_spectrum_h, spectrum_size * sizeof(uint64_t *), cudaMemcpyHostToDevice)); 

利用できる完全なコードhere

UPDATE:

私はこの方法でやってみました、この配列を使用しているとき、私は、カーネルに(コードの他の部分にSIGSEGVを持っているノイ。たぶん、他のエラーが原因である。

uint64_t * gpu_hashed_spectrum; 
    HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum, sizeof(uint64_t) * spectrum_size)); 
    HANDLE_ERROR(cudaMemcpy(gpu_hashed_spectrum, hashed_spectrum, spectrum_size * sizeof(uint64_t), cudaMemcpyHostToDevice)); 
+0

真剣に、最後の質問への回答でこれを行う方法の完全な実例をお渡ししました。昨日から質問の重複としてこれを閉じなければならない理由を教えてください。 – talonmies

+0

これは同じ問題ではありません。昨日の例は実際にうまくいきます。ここの問題は割り振りにありませんが、これがSIGSEGVを作るという事実...私はとてもうまく理解できませんでした...とても残念です...私は昨日の例のアイデアでこれを作った – Cordaz

+0

あなたは何をしようとしているのか分かりません。 'gpu_hashed_spectrum'は' uint64_t * 'のためのスペースを割り当てているのでポインタへのポインターになることはかなり明白です(そして深いコピーをしようとしているようです)なぜあなたはそれを単一のポインタとして宣言していますか?そして実際には、あなたのループされた 'cudaMemcpy'演算が示唆しているように(' sizeof(uint64_t) ')、各単一ポインタが* 1 *データ項目だけを指している深いコピーをしようとしていますか?どうしてそうするか? –

答えて

1

少なくとも、あなたはuint64_t**unit64_t*について混乱している。

行目で

は、タイプunit64_tのいくつかのデータを指し、ポインタとしてgpu_hashed_spectrumを定義したが、ライン3

HANDLE_ERROR(cudaMalloc((void **)&gpu_hashed_spectrum, sizeof(uint64_t *) * spectrum_size)); 

であなたはタイプunit64_t*のいくつかのデータを指し、ポインタとしてgpu_hashed_spectrumを使用します。

たぶん、あなたは

uint64_t** gpu_hashed_spectrum; 

だけでなく、いくつかの他のラインにあなたの定義を変更する必要があります。

関連する問題