我正在研究这个主题,作为我的研讨会演示的一部分。我想知道如何根据数据依赖性编写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值
答案 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有一个相关的教程/白皮书,介绍算法开发。