For loop 存在数据依赖关系时的CUDA正确性

For loop 存在数据依赖关系时的CUDA正确性,for-loop,cuda,dependencies,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的大值,代码行s1不依赖于s2或其他任何东西。因此,a[6..N-1]都可以并行计算a[0..5]不受此操作的修

作为我研讨会演讲的一部分,我正在研究这个主题。我想知道如何根据数据依赖性编写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的大值,代码行s1不依赖于s2或其他任何东西。因此,
a[6..N-1]
都可以并行计算<代码>a[0..5]不受此操作的修改

一旦上述操作并行完成,就可以执行另一个并行操作来计算
x[i]
,因为它只依赖于已经计算的
a[i]

这个特殊的问题很容易归类为一个没有循环携带依赖项的问题

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

for i=1 to N
 a[i] += a[i-1];         
endfor
但是,这些问题通常属于一类或多类已经解决了并行实现的问题。上面是前缀和的一个例子。如果你在谷歌搜索并行前缀和,你会发现并行

循环携带相关性的另一个示例是减少:

sum = 0;
for i=1 to N
 sum += a[i];         
endfor
有一个相关的教程/白皮书,介绍算法开发