gpt4 book ai didi

OpenCL 从大数组中选择/删除点

转载 作者:行者123 更新时间:2023-12-01 15:25:05 25 4
gpt4 key购买 nike

我有一组 2M+ 点(计划在适当的时候增加到 20M),我正在通过 OpenCL 运行计算。我想删除落在随机三角形几何图形中的所有点。

如何在 OpenCL 内核进程中执行此操作?

我已经可以:

  • 识别那些落在三角形之外的点(内核中poly算法中的简单点)

  • 将它们的坐标传递到全局输出数组。

但是:

  • openCL 全局输出数组不能是可变的,因此我将其初始化以在大小方面匹配点的输入数组

  • 因此,当一个点落在三角形内时,最终输出中出现 0,0 个点

  • 因此,输出数组本身不会导致任何缩减。

可以在 openCL 上下文中删除 0,0 点吗?

注意我在 OpenFrameworks 中编码,所以 C++ 实现链接到 .cl 文件

最佳答案

只是大多数点落在原子条件内的情况的替代方案:

可以有一个本地计数器和本地原子。然后将该原子合并到全局值,可以使用 atomic_add()。女巫将返回“以前的”全局值。因此,您只需将索引复制到该地址及以上。

这应该是一个明显的加速,因为线程将在本地同步并且只在全局同步一次。全局副本可以并行,因为地址永远不会重叠。

例如:

__kernel mykernel(__global MyType * global_out, __global int * global_count, _global MyType * global_in){
int lid = get_local_id(0);
int lws = get_local_size(0);
int idx = get_global_id(0);

__local int local_count;
__local int global_val;
//I am using a local container, but a local array of pointers to global is possible as well
__local MyType local_out[WG_SIZE]; //Ensure this is higher than your work_group size
if(lid==0){
local_count = 0; global_val = -1;
}
barrier(CLK_LOCAL_MEM_FENCE);

//Classify them
if(global_in[idx] == ....)
local_out[atomic_inc(local_count)] = global_in[idx];

barrier(CLK_LOCAL_MEM_FENCE);

//If not, we are done
if(local_count > 0){
//Only the first local ID does the atomic to global
if(lid == 0)
global_val = atomic_add(global_count,local_count);

//Resync all the local workers here
barrier(CLK_LOCAL_MEM_FENCE);

//Copy all the data
for(int i=0; i<local_count; i+=lws)
global_out[global_val+i] = local_out[i];
}
}

注意:我没有编译它,但或多或​​少应该可以工作。

关于OpenCL 从大数组中选择/删除点,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31517754/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com