このような2つのcudaカーネル関数があります
a<<<BLK_SIZE,THR_SIZE>>>(params,...);
b<<<BLK_SIZE,THR_SIZE>>>(params,...);
関数 a が開始された後、関数 a が終了するまで待ってから関数 b を開始したいと考えています。だから私はこのように a と b の間に cudaThreadSynchronize() を挿入しました、
a<<<BLK_SIZE,THR_SIZE>>>(params,...);
err=cudaThreadSynchronize();
if( err != cudaSuccess)
printf("cudaThreadSynchronize error: %s\n", cudaGetErrorString(err));
b<<<BLK_SIZE,THR_SIZE>>>(params,...);
ただし、cudaThreadSynchronize() はエラー コードを返します。the launch timed out and was terminated cuda error
どうすれば修正できますか?
簡単なコードの説明:
mmap(sequence file);
mmap(reference file);
cudaMemcpy(seq_cuda, sequence);
cudaMemcpy(ref_cuda,reference);
kernel<<<>>>(params); //find short sequence in reference
cudaThreadSynchronize();
kernel<<<>>>(params);
cudaMemcpy(result, result_cuda);
report result
カーネル関数には、比較の数を減らすためのパターン マッチング アルゴリズムの if-else を含む大きな for ループがあります。