- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
众所周知,WaveFront (AMD OpenCL) 与 WARP (CUDA) 非常相似:http://research.cs.wisc.edu/multifacet/papers/isca14-channels.pdf
GPGPU languages, like OpenCL™ and CUDA, are called SIMT because they map the programmer’s view of a thread to a SIMD lane. Threads executing on the same SIMD unit in lockstep are called a wavefront (warp in CUDA).
众所周知,AMD 建议我们使用本地内存(减少)数字加法。为了加速加法(Reduce),建议使用向量类型:http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/01/AMD_OpenCL_Tutorial_SAAHPC2010.pdf
<小时/>但是WaveFront中的项目(线程)之间是否存在任何优化的寄存器到寄存器数据交换指令:
例如int __shfl_down(int var, unsigned int delta, int width=warpSize);
在 WARP (CUDA) 中:https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/
或如 __m128i _mm_shuffle_epi8(__m128i a, __m128i b);
x86_64 上的 SIMD channel :https://software.intel.com/en-us/node/524215
例如,此洗牌指令可以执行来自 8 个线程/ channel 的 8 个元素的 Reduce(将数字相加),3 个周期,无需任何同步,也无需使用任何缓存/本地/共享内存(每次访问有大约 3 个周期的延迟)。
即线程将其值直接发送到其他线程的寄存器:https://devblogs.nvidia.com/parallelforall/faster-parallel-reductions-kepler/
或者在 OpenCL 中我们只能使用指令 gentypen shuffle( gentypem x, ugentypen mask )
只能用于矢量类型,例如 float16/uint16进入每个项目(线程),但不在 WaveFront 中的项目(线程)之间:https://www.khronos.org/registry/OpenCL/sdk/1.1/docs/man/xhtml/shuffle.html
我们可以使用类似 shuffle()
的东西吗?对于 WaveFront 中的项目(线程)之间的寄存器到寄存器数据交换,哪个比通过本地内存进行数据交换更快?
AMD OpenCL 中是否有用于 WaveFront 内寄存器到寄存器数据交换的指令,例如指令 __any()
, __all()
, __ballot()
, __shfl()
对于 WARP 内(CUDA):http://on-demand.gputechconf.com/gtc/2015/presentation/S5151-Elmar-Westphal.pdf
扭曲投票功能:
__any(predicate)
如果任何谓词为扭曲中的线程返回非零__all(predicate)
如果所有谓词都返回非零扭曲中的线程返回非零__ballot(predicate)
返回包含各个位的位掩码谓词返回非零的线程集__shfl(value, thread)
从请求的线程返回值(但前提是该线程还执行了 __shfl() 操作)结论:
众所周知,在 OpenCL-2.0 中,有一些具有类似于 WaveFronts 的 SIMD 执行模型的子组:Does the official OpenCL 2.2 standard support the WaveFront?
对于子组,有 - 第 160 页:http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf
int sub_group_all(int predicate)
与 CUDA- __all(predicate)
相同int sub_group_any(int predicate);
与 CUDA- __any(predicate)
相同但是在 OpenCL 中没有类似的函数:
__ballot(predicate)
__shfl(value, thread)
2016 年 8 月 28 日发布的第 4 版 OpenCL 扩展最终草案 #35 中仅包含 Intel 指定的内置 shuffle 函数:intel_sub_group_shuffle
, intel_sub_group_shuffle_down
, intel_sub_group_shuffle_down
, intel_sub_group_shuffle_up
: https://www.khronos.org/registry/OpenCL/extensions/intel/cl_intel_subgroups.txt
OpenCL中也有一些函数,通常通过shuffle-functions实现,但并不是所有的函数都可以使用shuffle-functions实现:
<gentype> sub_group_broadcast( <gentype> x, uint sub_group_local_id );
<gentype> sub_group_reduce_<op>( <gentype> x );
<gentype> sub_group_scan_exclusive_<op>( <gentype> x );
<gentype> sub_group_scan_inclusive_<op>( <gentype> x );
摘要:
shuffle
- 函数保持更灵活的函数,并通过直接寄存器到寄存器数据交换确保线程之间尽可能最快的通信。
但功能 sub_group_broadcast
/_reduce
/_scan
不保证寄存器之间的直接数据交换,并且这些子组功能不太灵活。
最佳答案
有
gentype work_group_reduce<op> ( gentype x)
对于版本>=2.0
但它的定义没有提及任何有关使用本地内存或寄存器的内容。这只是将每个协作者的 x 值减少为所有值的总和。此功能必须被所有工作组项目命中,因此它不采用波前级别方法。另外,浮点运算的顺序也无法保证。
也许有些供应商采用注册方式,而有些供应商则使用本地内存。我猜Nvidia是用寄存器来做的。但旧的主流 AMD GPU 的本地内存带宽为 3.7 TB/s,这仍然是一个不错的数字。 (编辑:不是 22 TB/s)对于 2k 核心,这意味着每个核心每个周期接近 1.5 个字节,或者每个缓存线更快。
对于%100寄存器(如果不溢出到全局内存)版本,如果元素数量只有8或16,您可以减少线程数量并在线程本身中进行矢量化减少,而无需与其他人通信。例如
v.s0123 += v.s4567
v.s01 += v.s23
v.s0 += v.s1
它应该类似于 __m128i _mm_shuffle_epi8 及其在 CPU 上编译时的总和版本,并且非标量实现将在 GPU 上使用相同的 SIMD 来执行这 3 个操作。
此外,使用这些向量类型往往会使用高效的内存事务,甚至对于全局和本地事务也是如此,而不仅仅是寄存器。
SIMD 一次仅适用于单个波前,但一个波前可能由多个 SIMD 处理,因此,此矢量运算并不意味着正在使用整个波前。或者甚至整个波前可能正在计算一个周期中所有向量的第一个元素。但对于 CPU 来说,最合理的选择是 SIMD 逐一计算工作项(avx、sse),而不是通过相同的索引元素并行计算它们。
<小时/>如果主工作组不符合要求,则会生成子内核并使用动态宽度内核来进行此类操作。子内核同时在另一个称为sub-group
的组上工作。这是在设备端队列中完成的,并且需要 OpenCl 版本至少为 2.0。
在 http://amd-dev.wpengine.netdna-cdn.com/wordpress/media/2013/12/AMD_OpenCL_Programming_User_Guide2.pdf 中查找“设备端排队”
AMD APP SDK 支持子组
关于multithreading - 我们可以使用 `shuffle()` 指令在 WaveFront 中的项目(线程)之间进行 reg-to-reg 数据交换吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42260986/
我需要修复 getLineNumberFor 方法,以便如果 lastName 的第一个字符位于 A 和 M 之间,则返回 1;如果它位于 N 和 Z 之间,则返回 2。 在我看来听起来很简单,但我不
您好,感谢您的帮助!我有这个: 0 我必须在每次点击后增加“pinli
Javascript 中是否有一种方法可以在不使用 if 语句的情况下通过 switch case 结构将一个整数与另一个整数进行比较? 例如。 switch(integer) { case
我有一列是“日期”类型的。如何在自定义选项中使用“之间”选项? 最佳答案 请注意,您有2个盒子。 between(在SQL中)包含所有内容,因此将框1设置为:DATE >= startdate,将框2
我有一个表,其中包含年、月和一些数字列 Year Month Total 2011 10 100 2011 11 150 2011 12 100 20
这个问题已经有答案了: Extract a substring between double quotes with regular expression in Java (2 个回答) how to
我有一个带有类别的边栏。正如你在这里看到的:http://kees.een-site-bouwen.nl/ url 中类别的 ID。带有 uri 段(3)当您单击其中一个类别时,例如网页设计。显示了一
这个问题在这里已经有了答案: My regex is matching too much. How do I make it stop? [duplicate] (5 个答案) 关闭 4 年前。 我
我很不会写正则表达式。 我正在尝试获取括号“()”之间的值。像下面这样的东西...... $a = "POLYGON((1 1,2 2,3 3,1 1))"; preg_match_all("/\((
我必须添加一个叠加层 (ImageView),以便它稍微移动到包含布局的左边界的左侧。 执行此操作的最佳方法是什么? 尝试了一些简单的方法,比如将 ImageView 放在布局中并使用负边距 andr
Rx 中是否有一些扩展方法来完成下面的场景? 我有一个开始泵送的值(绿色圆圈)和其他停止泵送的值(簧片圆圈),蓝色圆圈应该是预期值,我不希望这个命令被取消并重新创建(即“TakeUntil”和“Ski
我有一个看起来像这样的数据框(Dataframe X): id number found 1 5225 NA 2 2222 NA 3 3121 NA 我有另一个看起来
所以,我正在尝试制作正则表达式,它将解析存储在对象中的所有全局函数声明,例如,像这样 const a = () => {} 我做了这样的事情: /(?:const|let|var)\s*([A-z0-
我正在尝试从 Intellivision 重新创建 Astro-Smash,我想让桶保持在两个 Angular 之间。我只是想不出在哪里以及如何让这个东西停留在两者之间。 我已经以各种方式交换了函数,
到处检查但找不到答案。 我有这个页面,我使用 INNER JOIN 将两个表连接在一起,获取它们的值并显示它们。我有这个表格,用来获取变量(例如开始日期、结束日期和卡号),这些变量将作为从表中调用值的
我陷入了两个不同的问题/错误之间,无法想出一个合适的解决方案。任何帮助将不胜感激 上下文、FFI 和调用大量 C 函数,并将 C 类型包装在 rust 结构中。 第一个问题是ICE: this pat
我在 MySQL 中有一个用户列表,在订阅时,时间戳是使用 CURRENT_TIMESTAMP 在数据库中设置的。 现在我想从此表中选择订阅日期介于第 X 天和第 Y 天之间的表我尝试了几个查询,但不
我的输入是开始日期和结束日期。我想检查它是在 12 月 1 日到 3 月 31 日之间。(年份可以更改,并且只有在此期间内或之外的日期)。 到目前为止,我还没有找到任何关于 Joda-time 的解决
我正在努力了解线程与 CPU 使用率的关系。有很多关于线程与多处理的讨论(一个很好的概述是 this answer )所以我决定通过在运行 Windows 10、Python 3.4 的 8 CPU
我正在尝试编写 PHP 代码来循环遍历数组以创建 HTML 表格。我一直在尝试做类似的事情: fetchAll(PDO::FETCH_ASSOC); ?>
我是一名优秀的程序员,十分优秀!