存在数据依赖性时的CUDA正确性

时间:2014-04-09 23:41:22

标签: for-loop cuda dependencies

我正在研究这个主题,作为我的研讨会演示的一部分。我想知道如何根据数据依赖性编写cuda程序。

例如:

   for i=1 to N
    s1:  a[i+5]=i;         
    s2:  x[i]=a[i] + c;   //X[] is N-sized array 
   endfor

从s1到s2存在数据依赖性。如何编写CuDA代码来对此循环进行向量化?比较大的N值

1 个答案:

答案 0 :(得分:2)

代码行s1不依赖于s2或其他任何东西。因此,a[6..N-1]都可以并行计算。 a[0..5]未被此操作修改。

上述操作并行完成后,可以执行另一个并行操作来计算x[i],因为它只取决于已经计算过的a[i]

这个特殊问题很容易理解为没有循环依赖的问题。

循环携带依赖关系的问题可能更难以解决:

for i=1 to N
 a[i] += a[i-1];         
endfor

但是这些问题通常属于已经完成并行实现的一类或多类问题。以上将是前缀和的示例。如果您对并行前缀和进行谷歌搜索,则会同时找到examples of how it may be handled

循环携带依赖的另一个例子是减少:

sum = 0;
for i=1 to N
 sum += a[i];         
endfor

parallel reduction cuda sample code有一个相关的教程/白皮书,介绍算法开发。