0

我有两个这样的 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

在内核函数中,有一个大的 for 循环,其中包含一些用于模式匹配算法的 if-else 以减少比较次数。

4

1 回答 1

1

这个启动错误意味着当你的第一个内核启动时出现了问题,或者甚至可能在此之前出现了问题。要解决这个问题,请尝试检查所有 CUDA 运行时调用的输出是否有错误。此外,在所有内核调用之后执行 cudaThreadSync 和错误检查。这应该可以帮助您找到发生错误的第一个位置。

如果确实是启动失败,则需要调查内核的执行配置和代码来查找错误原因。

最后,请注意,您添加 cudaThreadSynchronize 的操作极不可能导致此错误。我这样说是因为您对查询的措辞指向 cudaThreadSynchronize 作为罪魁祸首。这个调用所做的只是更早地捕获您现有的错误。

于 2012-03-28T07:09:34.710 回答