CUDA阵列并行滤波(计算架构)
我正在尝试开发一个框架,用于在F#中执行标准功能序列操作(映射、过滤、折叠等),其中计算是在GPU(使用CUDA)而不是CPU上执行的 我已经成功地实现了一个CUDA映射函数,这样我就可以编写CUDA阵列并行滤波(计算架构),cuda,f#,gpu,gpgpu,Cuda,F#,Gpu,Gpgpu,我正在尝试开发一个框架,用于在F#中执行标准功能序列操作(映射、过滤、折叠等),其中计算是在GPU(使用CUDA)而不是CPU上执行的 我已经成功地实现了一个CUDA映射函数,这样我就可以编写 let result = cudaArray |> CudaArray.map <@ fun x -> x ** 3.0 @> |> Array.ofCudaArray 让结果= CUDA阵列 |>CudaArray.map x**3.0@>
let result =
cudaArray
|> CudaArray.map <@ fun x -> x ** 3.0 @>
|> Array.ofCudaArray
让结果=
CUDA阵列
|>CudaArray.map x**3.0@>
|>数组.ofCudaArray
这相对简单,因为所有操作都是按元素执行的
现在,我感兴趣的是编写一个类似的系统,通过一些谓词进行过滤。我正在考虑将谓词实现为另一个返回布尔数组的映射函数,但我需要找到一种方法,将感兴趣的数组减少为匹配的布尔数组元素的值为true的数组
我发现这篇文章()描述了解决这个问题的一个非常好的方法,它归结为使用以下函数来索引目标数组中的元素:
// 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
//扭曲聚合原子增量
__装置__
国际原子能公司(国际*ctr){
整数掩码=uuu选票(1);
//选择引线
int leader=uu ffs(掩码)–1;
//领导进行更新
国际关系;
如果(车道id()==引线)
res=原子添加(ctr,_uPOPC(掩码));
//广播结果
res=扭曲广播(res,leader);
//每个线程计算自己的值
返回res+_uPOPC(掩码和(1