【发布时间】:2018-08-31 05:07:42
【问题描述】:
作为一个学校项目,我们 4 正在使用 OpenCL 开发并行光线追踪器。 这是我们第一个使用 OpenCL 的项目,所以我们可能对它有一些不理解。
我们正在尝试实现并行缓冲区压缩以移除完成的光线或未与任何物体发生碰撞的光线,以便下一次迭代处理更少的数据。
基本上,我们有一个足够多的s_ray_states 缓冲区,用于渲染、跟踪它们、获取碰撞数据、压缩缓冲区,以便只有光线与其中的对象碰撞,然后对它们进行着色。
所以我们有一个缓冲区uint *prefix_sum,其中包含每个s_ray_state必须移动到缓冲区s_ray_state *ray_states中的索引,以减少发送到着色内核的光线数量,以及下一个跟踪/阴影内核的迭代。
遗憾的是,下面的 ray_sort 内核似乎无法正常工作,我们验证了输入 prefix_sum 数据,这是 100% 正确的,对于 ray_states 缓冲区也是如此,但我们在其中收到了不需要的数据输出。
我们正在启动一个工作组(全局工作大小 = 局部工作大小),光线总是在缓冲区中移动到比其原始索引更小的索引。我们设置了障碍,并使用s_ray_state *tmp 缓冲区来防止并行执行写入彼此的数据,但它似乎不起作用,即使移除障碍我们也会得到相同的结果。
我们俩都已经搞了 4 天了,已经向其他同学求助了,但似乎没有人能够弄清楚哪里出了问题。 我们可能对障碍/内存栅栏的了解不够,无法确保这实际上可以工作。
我们已经尝试让单个工作组中的单个工作项对整个数组进行排序,这很有效,甚至可以提供更好的性能。
下面的代码应该可以工作吗?以我们对 OpenCL 的理解,它应该可以工作,我们做了很多研究,但从未真正得到任何明确的答案..
kernel void ray_sort(
global read_only uint *prefix_sum,
global read_write struct s_ray_state *ray_states,
global read_only uint *ray_states_size,
local read_write struct s_ray_state *tmp
)
{
int l_size = get_local_size(0);
int l_id = get_local_id(0);
int group_id = -1;
int group_nb = *ray_states_size / l_size;
int state_id;
while (++group_id < group_nb)
{
state_id = group_id * l_size + l_id;
tmp[l_id] = ray_states[state_id];
barrier(CLK_LOCAL_MEM_FENCE);
if (did_hit(tmp[l_id]))
ray_states[prefix_sum[state_id]] = tmp[l_id];
barrier(CLK_GLOBAL_MEM_FENCE);
}
}
ray_states 长度为ray_states_size
prefix_sum 包含每个 ray_states 元素必须移动到的索引
tmp 是大小为 local_work_size 的本地缓冲区
local_work_size = global_work_size
did_hit() 如果射线击中一个物体返回 1,否则返回 0
我们希望将 ray_states 元素移动到包含在 prefix_sum 中的索引
示例:每个ray_states[id] 都被移动到prefix_sum[id] 索引中
ray_states
prefix_sum: 0 | 0 | 1 | 1 | 2 | 3 | 3 | 3 | 4
did_hit(ray_states[id]): 0 | 1 | 0 | 1 | 1 | 0 | 0 | 1 | 0
did_hit(output[id]): 1 | 1 | 1 | 1 | X | X | X | X | X
Xs 可以是任何东西
【问题讨论】:
-
您好 elXor,我觉得您需要编辑问题以详细说明“我们在输出中收到了不需要的数据。” -- 即“我们期待(特定的东西)并得到(特定的东西)” -- 这样人们就可以专注于这个问题。
-
@LeonBambrick 我觉得我们得到的输出对于这个问题并不重要,我们只是期望 ray_states 中的元素被重新组织到 prefix_sum 中包含的索引。我们只是得到了一些没有按照预期方式重新组织的东西(元素没有移动到正确的索引)。
标签: parallel-processing opencl barrier stream-compaction