作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有一组 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/
我是一名优秀的程序员,十分优秀!