内核欠工作问题和执行成本

时间:2013-11-20 14:30:31

标签: optimization opencl

我有两个问题:

  1. 使内核过度工作或工作不足会更好吗?假设我想计算仅有4个GPU核心的差异图像。我应该考虑通过1个线程独立计算我的图像的任何像素,还是应该让1个线程计算我的图像的整行?我不知道哪种解决方案最适合使用。我已经对第一个选项进行了矢量化(这是一个被强化的选项),但我只获得了一些ms,这不是很有意义。
  2. 我的第二个问题是关于内核的执行成本。我知道如何测量任何OpenCL命令队列任务(复制,写入,读取,内核......)但我认为主机有时间将内核加载到GPU核心。有没有办法评估它?
  3. 巴普蒂斯特

1 个答案:

答案 0 :(得分:1)

(1)

通常,您处理内核中的单个项目。如果您处理多个项目,则需要按正确的顺序执行这些项目以确保合并内存访问权限,否则您将比执行单个项目更慢(解决方案是处理每个工作项的列而不是行)。

处理多个项目的速度较慢的另一个原因是您可能使计算单元空闲。例如,如果您使用700个计算单位处理1000x1000图像上的扫描线,则工作将分为700个工作项,然后只有300个工作项(剩余400个工作项)。

如果您要使用共享本地内存,那么您希望在单个内核中执行大量工作的情况。例如,如果将查找表(LUT)加载到SLM中,则应将其用于整个扫描线或图像。

(2)

我确定这是一个非零的时间,但它可以忽略不计。内核代码非常小。驱动程序处理将其移动到GPU,并处理将参数数据推送到GPU上。两者都非常快,可能在其他内核运行时发生,所以"免费"。