gpt4 book ai didi

opencl - 工作项执行顺序

转载 作者:行者123 更新时间:2023-12-04 04:50:21 26 4
gpt4 key购买 nike

我正在使用 OpenCL。我对以下示例中将如何执行工作项感兴趣。

我的一维范围为 10000,工作组大小为 512。内核如下:

__kernel void
doStreaming() {
unsigned int id = get_global_id(0);

if (!isExecutable(id))
return;

/* do some work */
}

在这里它检查是否需要处理具有以下 id 的元素。

假设执行从第一个 512 大小的工作组开始,其中 20 个被 isExecutable 拒绝。 . GPU 是否会在不等待前 492 个元素的情况下继续执行其他 20 个元素?

不涉及任何障碍或其他同步技术。

最佳答案

当某些工作项与通常的/* 做一些工作 */ fork 很远时,它们可以通过从 next wavefront(amd) 或 next warp(nvidia) 获取指令来利用管道占用优势,因为当前的 warp/wavefront 工作项正忙于做其他事情。但这会导致内存访问序列化并清除工作组的访问顺序,从而降低性能。

避免发散经线/波前 :如果你在循环中执行 if 语句,那真的很糟糕,所以你最好找到另一种方法。

如果工作组中的每个工作项都具有相同的分支,那么就可以了。

如果每个工作项每数百次计算只做很少的分支,那也没关系。

尝试为所有工作项(非常并行的数据/算法)生成相等的条件,以利用 GPU 提供的能力。

我知道摆脱最简单的分支与计算情况的最佳方法是使用全局是-否数组。 0=yes, 1=no :始终计算,然后将结果与工作项的 yes-no 元素相乘。通常,为每个内核添加 1 字节元素内存访问比每个内核进行一个分支要好得多。在添加这个 1 字节后,实际上使对象长度为 2 的幂可能会更好。

关于opencl - 工作项执行顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17517138/

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