在CUDA中处理变量固定大小的工作组

时间:2016-12-01 15:43:02

标签: cuda

我发现自己想编写类似于:

的CUDA代码
__constant__ int cumulativeGroupThreadCount[GroupCount];

__device__ int SearchForGroupIndex()
{
    int gridThreadID = blockIdx.x*blockDim.x + threadIdx.x;
    int groupIndex = 0;
    int sum = 0;


    while(groupIndex < GroupCount && gridThreadID <= sum)
    {
        sum += cumulativeGroupThreadCount[groupIndex];
        ++groupIndex;
    }

    return groupIndex;
}

__device__ KernelMain()
{
    GroupData data = groupData[SearchForGroupIndex()];

    ...
}

意图处理数据组,其中每个组的大小可能不同,但我希望使用一个CUDA线程处理每个组项。每个组都有一个特定的相关组数据。

如果组的数量不是那么大,那么我认为它可能不是最差的方法?

随着组数的增加,我可以开始考虑更复杂的warp / block宽二进制搜索类型行为,但我觉得在那时它不会是一个好主意。

另一种方法可能是按大小对每个组进行排序/存储,然后使用相同的大小处理每个组,每个组都有一个分派。或者是每个组中最大项目数的变化,导致可能需要屏蔽多个无用的线程。可能分成多批次以减少浪费。

更简单的方法当然是为每个线程存储组数据的索引,但这可能会浪费更多的空间和内存带宽呢?

通常在CUDA中有更好的方法来解决这类问题吗?

1 个答案:

答案 0 :(得分:1)

二进制搜索应该运行良好。它将具有良好的内存局部性,因为相邻线程将在相同或相邻的组中,并且如果平均组大小相对于warp大小,则分支差异将是最小的。

这样的事情:

localStorage