我发现自己想编写类似于:
的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中有更好的方法来解决这类问题吗?
答案 0 :(得分:1)
二进制搜索应该运行良好。它将具有良好的内存局部性,因为相邻线程将在相同或相邻的组中,并且如果平均组大小相对于warp大小,则分支差异将是最小的。
这样的事情:
localStorage