我有以下 C++ 代码,我必须在 CUDA 中并行化。
#include <iostream>
using namespace std;
int main() {
int length = 4;
int x = 3;
int a[length + 1] = {0, 3, 5, 9, 12};
int b[length * x];
for (int i = 0; i < length ; i++) {
for (int j = a[i]; j < a[i+1]; j++) {
b[i * x + j - a[i]] = a[i] + j;
}
}
}
如果内部循环运行固定次数,那么这将是简单的。但由于内部循环的长度是可变的,并且取决于从外部循环获得的值,我不确定如何以有效使用线程的方式将其展平。
我尝试仅并行化外循环并保持内循环不变。但我想知道是否有更有效的方法来解决这个问题。
让每个线程通过扫描
a
的所有元素来计算 b 的 1 个元素。
int threadId=mapping of threads for elements of b;
int indexB = threadId;
for(int i=0;i<N-1;i++)
{
if(A[i+1] > myRangeOfB && A[i] <= myRangeOfB)
{
B[indexB] = A[i] + i;
}
}
这是 O(N * numThreads) 所以它很昂贵,但是可以从
A
的缓存中得到帮助,如果它足够小,它会很快,因为所有线程都在做相同的工作量(取决于不发散的分支) .