如何使用可变长度内循环来展平 CUDA 中的嵌套循环?

问题描述 投票:0回答:1

我有以下 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;
        }
    }
}

如果内部循环运行固定次数,那么这将是简单的。但由于内部循环的长度是可变的,并且取决于从外部循环获得的值,我不确定如何以有效使用线程的方式将其展平。

我尝试仅并行化外循环并保持内循环不变。但我想知道是否有更有效的方法来解决这个问题。

c++ loops cuda gpu
1个回答
1
投票

让每个线程通过扫描

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
的缓存中得到帮助,如果它足够小,它会很快,因为所有线程都在做相同的工作量(取决于不发散的分支) .

© www.soinside.com 2019 - 2024. All rights reserved.