首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >本地和全球大小对程序执行的影响- OpenCl

本地和全球大小对程序执行的影响- OpenCl
EN

Stack Overflow用户
提问于 2017-01-24 11:22:12
回答 1查看 285关注 0票数 2

在阅读了大量关于全球工作规模和本地工作规模的定义之后,我仍然不知道它们是什么以及它们是如何工作的。我认为全局工作大小决定了内核函数将被调用多少次,但是局部工作大小?

我认为本地工作大小决定了在同一时间并行使用多少线程,但我真的是正确的吗?

本地大小是每个全局大小值执行一个内核程序的线程数吗?我的意思是,当我们有全局大小= 1和局部大小=1时,内核函数将被调用一次,并且只有一个线程会处理它。但是,当全局大小= 4096,而本地大小(如果允许这么高的话)是1024,那么我们就有4096个内核函数调用,而每个调用都有1024个线程同时处理它?我说的对吗?

下面是我找到的一些示例代码:

我的另一个问题是:本地大小的变化如何影响代码?正如我所看到的,它显然是在全局的,没有局部的,那么局部的大小会改变到比1更大的大小吗,比如1会影响执行该算法的时间?

当我们在这个算法中有for循环时,它是否改变了局部大小的影响?在更改本地大小时,是否需要使用local _id来查看差异?

我在我的几个程序上测试了这一点,即使我只使用了global_id,改变本地工作大小也大大缩短了我的执行时间。那么它是如何工作的呢?我还是不明白。

提前谢谢你!

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-01-24 15:34:20

我认为本地工作大小决定了在同一时间并行使用多少线程,但我真的是正确的吗?

正确,但它是每个计算单位,而不是整个设备。如果计算单元比本地线程组多,则设备未被充分使用。当线程组多于计算单元而不是精确倍数时,一些计算单元在最后等待其他单位。当两个值相等(或精确倍数)时,那么“多少次”对于完全占用所有all是很重要的。

例如,一个8核cpu可以定义8个计算单元(可能+8个与硬件多线程)。但是,具有类似价格的GPU可以有20到64个计算单元。然后,即使在单个计算单元中,许多线程组也可以“处于运行中”,这不是显式地调优,而是根据每个线程和每个计算单元以及可能是每个gpu的资源使用而改变的。

本地大小的变化如何影响代码?正如我所看到的,它显然是在全局的,没有局部的,那么局部的大小会改变到比1更大的大小吗,比如1会影响执行该算法的时间?

可向量/可并行的内核代码具有将线程分配到ALU、核心SIMD或gpu计算单元的更宽SIMD的优点。对于一个CPU,可以同时发出8个标量指令。对于一个GPU来说,它可能有几千个大。因此,当您将本地大小减少到1时,您将并行线程问题的宽度限制为1 ALU,这会降低许多体系结构的性能。当您使本地大小太大时,每个线程的资源会下降,性能会受到影响。如果您不知道,opencl可以在参数为null时为您调整本地大小。

当我们在这个算法中有for循环时,它是否改变了局部大小的影响?在更改本地大小时,是否需要使用local _id来查看差异?

对于旧的和静态的调度结构,建议循环展开的步骤尺寸等于基本SIMD宽度的宽度。不,本地id只是对其计算单元中的线程id的查询,所以不需要查询它。

我在我的几个程序上测试了这一点,即使我只使用了global_id,改变本地工作大小也大大缩短了我的执行时间。那么它是如何工作的呢?

如果内核需要疯狂的资源,您可以考虑每个本地组一个线程。如果内核除了直接值以外不需要任何资源,则应该使其最大局部值。每个线程的资源分配(因为内核代码)很重要。新的体系结构有负载平衡,所以如果让api选择最优值,那么将来可能无关紧要。

为了保持所有ALU的忙碌,调度程序在每个内核上发出多个线程,当一个线程等待内存操作时,另一个线程可以同时执行ALU操作。当资源使用量很小时,这是很好的。当您使用计算单元的所有资源%50时,它只能有2个线程在运行。线程共享可共享的资源,如L1缓存、本地内存、寄存器文件。

用于标量浮点数的代码(如ci=ai+bi )是可向量的。如果编译器还没有在后台使用float8、float16和类似的结构,则可以获得更好的性能。这样,它需要更少的线程来完成所有的工作,而且访问内存的速度也更快。您还可以在内核中添加一个循环,以更多地减少线程数,这对CPU是很好的,因为在两个数据块之间需要更少的线程调度。对于GPU来说,这可能并不重要。

CPU的简单示例:

4核心,局部大小= 10,全局大小= 100

核心1和2各有3个线程组。核心3和4只有2个线程组。

  • 1: 30线程->全性能
  • 2: 30螺纹
  • 3: 20线程->表现不佳,更好地抢占其他工作。
  • 4: 20螺纹

虽然指令流水线对于核心1和2没有太多气泡,但是对于核心3和4,气泡在一段时间后就开始了,因此它们可以用于其他任务,例如并行运行的第二个内核、操作系统或某些数组复制。当你平等地使用所有内核,比如120个线程时,它们每秒就会完成更多的工作,但是如果内核已经在使用内存,CPU就不能执行数组复制(除非OS对其他线程有抢占性)。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41826953

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档