2016-03-23 4 views
-1

UDACITYを介してCUDAプログラミングを学び始めました。私は動的共有memeoryを使用しようとしても、次のエラーが発生します。CUDA - ダイナミック共有メモリがthrust :: system :: system_errorをトリガー

CUDA error at: main.cpp:55 
invalid argument cudaGetLastError() 
terminate called after throwing an instance of thrust::system::system_error' 
what(): unload of CUDA runtime failed 

We are unable to execute your code. Did you set the grid and/or block size correctly? 

私は非常に多くを検索しましたが、ここでどこが間違っているのか分かりませんでした。私は

compact_kernel<<<numBlocks, numThreadsPerBlock, sizeof(int)*1000>>>(d_inputVals, d_inputPos, d_outputVals, d_outputPos, numElems, 0); 
    compact_kernel<<<numBlocks, numThreadsPerBlock, sizeof(int)*1000>>>(d_inputVals, d_inputPos, &d_outputVals[numElems/2], &d_outputPos[numElems/2], numElems, 1); 

に最後の2行を変更した場合、コードを実行するときに興味深いことに、エラーがスローされませんでした。しかし、動的メモリ割り当てのための領域は定数に限定されるべきではないので、意味をなさない。たぶんそれは私のコードではなく、Udacityの設定ですか?私が書いたコードは以下の通りです。どんな助けでも大歓迎です。

__global__ void compact_kernel(unsigned int* const d_inputVals, 
    unsigned int* const d_inputPos, 
    unsigned int* const d_outputVals, 
    unsigned int* const d_outputPos, 
    const size_t numElems, 
    const size_t refBit) 
{ 
    const size_t tid = blockIdx.x * blockDim.x + threadIdx.x; 

    // predicate 
    const bool predicate = (d_inputVals[tid] & 1) == refBit; 
    extern __shared__ int s[]; 
} 

void your_sort(unsigned int* const d_inputVals, 
    unsigned int* const d_inputPos, 
    unsigned int* const d_outputVals, 
    unsigned int* const d_outputPos, 
    const size_t numElems) 
{ 
    const size_t numBlocks = numElems/512; 
    const size_t numThreadsPerBlock = 256; 
    compact_kernel<<<numBlocks, numThreadsPerBlock, sizeof(int)*numElems>>>(d_inputVals, d_inputPos, d_outputVals, d_outputPos, numElems, 0); 
    compact_kernel<<<numBlocks, numThreadsPerBlock, sizeof(int)*numElems>>>(d_inputVals, d_inputPos, &d_outputVals[numElems/2], &d_outputPos[numElems/2], numElems, 1); 

} `

EDIT: numElems個の値は220480.ある動的なメモリ割り当てのためには大きすぎる。この数か?

+1

'numElems'の値は何ですか? – talonmies

+0

共有メモリはスレッドブロックあたり48 KBに制限されています。あなたの数はこの制限を超えています。 – havogt

+1

@havogtありがとうございます。それだ。 :Dあなたは答えとしてあなたのコメントを投稿できますか? – Maverobot

答えて

1

すべての現在のCUDAデバイスでは、共有メモリはスレッドブロックあたり48KBに制限されています。programming guideによると、です。