-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));
真剣に、最後の質問への回答でこれを行う方法の完全な実例をお渡ししました。昨日から質問の重複としてこれを閉じなければならない理由を教えてください。 – talonmies
これは同じ問題ではありません。昨日の例は実際にうまくいきます。ここの問題は割り振りにありませんが、これがSIGSEGVを作るという事実...私はとてもうまく理解できませんでした...とても残念です...私は昨日の例のアイデアでこれを作った – Cordaz
あなたは何をしようとしているのか分かりません。 'gpu_hashed_spectrum'は' uint64_t * 'のためのスペースを割り当てているのでポインタへのポインターになることはかなり明白です(そして深いコピーをしようとしているようです)なぜあなたはそれを単一のポインタとして宣言していますか?そして実際には、あなたのループされた 'cudaMemcpy'演算が示唆しているように(' sizeof(uint64_t) ')、各単一ポインタが* 1 *データ項目だけを指している深いコピーをしようとしていますか?どうしてそうするか? –