我有两个这样的cuda内核函数
a<<<BLK_SIZE,THR_SIZE>>>(params,...);
b<<<BLK_SIZE,THR_SIZE>>>(params,...);
在函数启动后,我想等到完成然后启动函数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
在内核函数中,有一个很大的for循环,它包含一些if-else模式匹配算法,以减少比较次数。
答案 0 :(得分:1)
这个启动错误意味着在您的第一个内核启动时出现问题,甚至可能在此之前出现问题。为了解决这个问题,请尝试检查所有CUDA运行时调用的输出是否有错误。此外,在所有内核调用之后执行cudaThreadSync,然后进行错误检查。这应该可以帮助您找到发生错误的第一个位置。
如果确实是启动失败,您需要调查执行配置和内核代码以找出错误原因。
最后,请注意,添加cudaThreadSynchronize的操作极不可能导致此错误。我之所以这么说,是因为你的查询方式指向cudaThreadSynchronize作为罪魁祸首。所有这些调用都是为了早点发现你现有的错误。