我正试图将几个任务“映射”到CUDA GPU。有n个任务需要处理。 (看伪代码)CUDA线程/线程块之间的通信
malloc an boolean array flag[n] and initialize it as false.
for each work-group in parallel do
while there are still unfinished tasks do
Do something;
for a few j_1, j_2, .. j_m (j_i<k) do
Wait until task j_i is finished; [ while(flag[j_i]) ; ]
Do Something;
end for
Do something;
Mark task k finished; [ flag[k] = true; ]
end while
end for
由于某些原因,我将不得不使用不同线程块中的线程。
问题是如何实现等到任务j_i完成;和标记任务k完成; CUDA中的。我的实现是使用布尔数组作为标志。然后在任务完成后设置标志,并读取标志以检查任务是否完成。
但它只适用于小案例,一个大案例,GPU崩溃的原因不明。有没有更好的方法在CUDA中实现Wait和Mark。
这基本上是CUDA上的线程间通信问题。
你将不得不使用原子操作这..这花费了很多。 – angainor