问题标签 [avx]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
optimization - 有效地将 YMM 寄存器的低 64 位设置为常数
如何在最少的时钟周期内将 YMM 寄存器的最低 64 位设置为某个常数?我知道可以使用 SSE 指令以及 AVX 指令执行此操作的各种方法VBROADCASTSD
,但我不确定哪种方法会产生最佳结果。
编辑:设置 64 位部分后,我仍然需要使用完整的 YMM 寄存器。
谢谢你的帮助!
x86 - 使用 AVX 指令进行水平向量求和的最快方法
我有四个 64 位浮点值的压缩向量。
我想得到向量元素的总和。
使用 SSE(并使用 32 位浮点数)我可以执行以下操作:
不幸的是,尽管 AVX 具有 _mm256_hadd_pd 指令,但它的结果与 SSE 版本不同。我相信这是因为大多数 AVX 指令分别作为每个低 128 位和高 128 位的 SSE 指令工作,而从未跨越 128 位边界。
理想情况下,我正在寻找的解决方案应遵循以下准则:
1)仅使用 AVX/AVX2 指令。(无 SSE)
2)在不超过 2-3 条指令中完成。
但是,任何有效/优雅的方法(即使不遵循上述准则)总是被广泛接受。
非常感谢您的帮助。
——路易吉·卡斯特利
x86 - 如何在 256 位 AVX 向量中找到水平最大值
我有一个包含四个 64 位浮点值的 __m256d 向量。
我需要找到向量元素的水平最大值并将结果存储在双精度标量值中;
我的尝试最终都使用了大量的向量元素洗牌,使得代码不是很优雅也不是很高效。另外,我发现不可能只停留在 AVX 域中。在某些时候,我不得不使用 SSE 128 位指令来提取最终的 64 位值。但是,我想在最后一个陈述中被证明是错误的。
所以理想的解决方案是:
1)只使用 AVX 指令。
2)尽量减少指令数量。(我希望不超过 3-4 条指令)
话虽如此,任何优雅/高效的解决方案都将被接受,即使它不遵守上述准则。
谢谢你的帮助。
-路易吉
gcc - 如何在 Mac OS X 上使用 AVX/pclmulqdq
我正在尝试编译一个使用新英特尔处理器中存在的 pclmulqdq 指令的程序。我已经使用 macports 安装了 GCC 4.6,但是当我编译我的程序(它使用内在的 _mm_clmulepi64_si128)时,我得到了
似乎 GCC 能够从内部生成正确的汇编代码,但汇编器无法识别该指令。
我已经使用 macports 安装了 binutils,但问题仍然存在。我怎么知道 gcc 正在使用哪个汇编程序?XCode 汇编器可能不支持它,但 binutils 汇编器应该。
c++ - 为什么分配给 AVX-Vector-wrapper-class-object-array 的元素会引发访问冲突错误?
我正在尝试做一些向量的东西,并为 immintrin.h 中的 m256d 数据类型编写了一个包装器,以使用重载运算符。下面的例子应该给你一个基本的想法。
类定义
vwrap 对象数组
让我们想象一个动态分配的 vwrap 数组:
访问冲突错误
使用包含 mm256-set-function... 的 vwrap 对象的函数会引发访问冲突错误。
使用 mm256-set-function 分配 d 也会发生同样的事情(分配另一个 m256d-object 也不起作用):
从另一个对象复制数据也不起作用。
有效的东西
可以毫无问题地操作 m256d 对象:
在普通类实例的情况下,分配工作:
我不明白这个问题。在类数组的情况下,为什么我不能使用 _mm256 函数(或分配 m256d 对象)?我唯一的想法是避免使用 mm256 函数并直接操作双精度值。但这不是我故意想要做的。
delphi - 如何探测英特尔® 高级矢量扩展的可用性?
如何使用 Delphi 2007 检查一个盒子是否支持 AVX。
我的问题仅限于查询 CPU 中的支持(假设操作系统正常/带有 SP1 的 Windows 7)。
由 Chris Lomont撰写的题为Intel® Advanced Vector Extensions 简介的 PDF 文档 解释了如何做到这一点,并提供了一个示例代码实现,但使用 c++。
它也可以在这个页面上找到。
sse - 我在哪里可以找到 AMD FMA 4 内在函数的参考资料?
我正在尝试修改一段使用 SSE(128 位)调用的代码,以使用 Bulldozer Opteron 上的 256 位 FMA 功能。我似乎无法找到这些调用的内在函数。
这个论坛上的一些问题使用了这些内在函数(例如: 如何在 256 位 AVX 向量中找到水平最大值)
我发现了这个:http:
//msdn.microsoft.com/en-us/library/gg445140.aspx
和http://software.intel.com/sites/products/documentation/studio/composer/en-us/2011/ compiler_c/index.htm#intref_cls/common/intref_avx_fmadd_ps.htm
但我似乎无法在 AMD 开发人员文档中找到任何内容。
c++ - Intel AVX:用于双精度浮点变量的 256 位点积版本
英特尔高级矢量扩展 (AVX)在 256 位版本(YMM 寄存器)中不为双精度浮点变量提供点积。“为什么?” 这个问题已经在另一个论坛(这里)和 Stack Overflow(这里)上得到了非常简短的处理。但我面临的问题是如何以有效的方式用其他 AVX 指令替换这个缺失的指令?
单精度浮点变量存在 256 位版本中的点积(参考此处):
这个想法是为这个缺失的指令找到一个有效的等价物:
更具体地说,我想从__m128
(四个浮点数)转换为__m256d
(4个双精度数)的代码使用以下指令:
此代码的结果是一个包含四个浮点数的向量,其中包含和、和、和、和_m128
之间的点积结果。val1
val0
val2
val0
val3
val0
val4
val0
也许这可以为建议提供提示?
c++ - 如何将单个 32 位浮点加载到 AVX ymm 寄存器中的所有八个位置?
如何将单个 32 位浮点数加载/转换为 AVX 256 ymm 寄存器,以便所有 8 个浮点数都来自单源浮点数?
以前我使用 AVX 128 xmm 寄存器将单个浮点数加载到 4 个压缩浮点数中。
assembly - avx sqrt的三个操作数?
为什么 avx sqrt(非压缩)指令有三个操作数?
这是否意味着类似的东西xmm1=xmm2=sqrt(xmm3)
?
编辑:下面的详细答案,但简而言之,装配线意味着: