我正在尝试开发一个框架,用于在F#中执行标准的功能序列操作(映射,过滤,折叠等),其中计算是在GPU(使用CUDA)而不是CPU上执行的。
我在实现CUDA地图功能方面取得了一些成功,这样我就可以编写
了let result =
cudaArray
|> CudaArray.map <@ fun x -> x ** 3.0 @>
|> Array.ofCudaArray
这是相对简单的,因为所有操作都是按元素执行的。
现在,我有兴趣编写一个类似的系统来过滤一些谓词。我正在考虑将谓词实现为另一个返回布尔数组的map函数,但是我需要找到一种方法来将感兴趣的数组减少到匹配的布尔数组元素值为true的数组。
我发现这篇文章(http://devblogs.nvidia.com/parallelforall/cuda-pro-tip-optimized-filtering-warp-aggregated-atomics/)描述了解决这个问题的一个非常好的方法,它归结为使用以下函数来索引目标数组中的元素:
// warp-aggregated atomic increment
__device__
int atomicAggInc(int *ctr) {
int mask = __ballot(1);
// select the leader
int leader = __ffs(mask) – 1;
// leader does the update
int res;
if(lane_id() == leader)
res = atomicAdd(ctr, __popc(mask));
// broadcast result
res = warp_bcast(res, leader);
// each thread computes its own value
return res + __popc(mask & ((1 << lane_id()) – 1));
} // atomicAggInc
问题是,我从文章中了解到 warp_bcast 仅受Compute Capability 3.0卡或更高版本支持。
我很想知道是否有替代 warp_bcast 的Compute Capability&lt; 3.0或者如果有其他方法我可以用来解决这个问题,而不会牺牲文章中描述的所有巨大的性能提升? (要明确的是,如果他们可以帮我解决这个问题,我对所列文章中所描述的方法完全不同。)