Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/fsharp/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA阵列并行滤波(计算架构)_Cuda_F#_Gpu_Gpgpu - Fatal编程技术网

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@>

我正在尝试开发一个框架,用于在F#中执行标准功能序列操作(映射、过滤、折叠等),其中计算是在GPU(使用CUDA)而不是CPU上执行的

我已经成功地实现了一个CUDA映射函数,这样我就可以编写

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