问题标签 [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.
c - 在avx中执行等效于_mm_loaddup_pd的功能的最快方法是什么?
如果我在内存中有以下双打(按顺序),我希望能够执行以下操作:
A-> a1| b1| a2| b2
我能想到的一种方法是:
AVX 没有 _mm_loaddup_pd() 或 _mm_load1_pd()。那么我可以执行此操作的最快方式是什么(就延迟而言,不一定是指令数量)?
vectorization - zgemm 在 Intel 的 MIC 上
我必须使用 MIC 的 512 位向量单元完成以下任务:
我想到的方法类似于英特尔为 SSE 提出的方法,也适用于 AVX:
使用_mm512_swizzle_pd()
函数形成:
m0 = |a4|a4|a3|a3|a2|a2|a1|a1| 和 m0_t = |b4|b4|b3|b3|b2|b2|b1|b1| in0 = |d4|c4|d3|c3|d2|c2|d1|c1| in0_r = |c4|d4|c3|d3|c2|d2|c1|d1|
将上述两者相乘并使用类似于 MIC 的 addsub_pd() 的东西。但似乎没有相应的内在。
关于如何实现这一目标的任何建议?
英特尔的 MIC (Xeon Phi) 也有几个 FMA 内在函数,如 fmadd、fmsub、fnmadd、fnmsub,它们应该适合这种情况,我有以下两种方法:
有更好的方法吗?这些方法有什么问题吗?
vectorization - Xeon Phi 上的 loaddup_pd/unpacklo_pd
如果我在 512 宽的 SIMD 向量中有以下双精度数,例如在 Xeon Phi 寄存器中:
是否有可能使它成为:
使用一条指令?另外,由于双精度数没有按位内在函数,这仍然是实现上述目标的有效方法吗?
vectorization - 英特尔至强融核中的排列
假设我在 Xeon Phi 寄存器中有以下 4 个双精度向量:
我想将它们排列成以下内容:
目标是获得:
如何以最少的指令/周期数实现上述目标?
vectorization - Xeon Phi 中的分散/聚集
我指的是英特尔关于 Xeon Phi 指令集的手册,但无法理解分散/收集指令的工作原理。
假设我有以下双精度向量:
是否可以创建 4 个向量,如下所示:
使用这些说明?有没有其他方法可以实现这一目标?
c++ - 用于 AVX 和 SSE 的 Visual Studio 的 CPU 调度程序
我用两台电脑工作。一种不支持 AVX,一种支持 AVX。让我的代码在运行时找到我的 CPU 支持的指令集并选择适当的代码路径会很方便。我已经按照 Agner Fog 的建议制作了一个 CPU 调度程序(http://www.agner.org/optimize/#vectorclass)。但是,在我没有 AVX 编译和与 Visual Studio 链接的情况下,启用 AVX 的代码会导致代码在我运行时崩溃。
我的意思是,例如,我有两个源文件,一个是 SSE2 指令集,其中定义了一些 SSE2 指令,另一个是定义了 AVX 指令集和一些 AVX 指令。在我的主函数中,如果我只引用 SSE2 函数,代码仍然会由于启用了 AVX 和 AVX 指令的任何源代码而崩溃。关于如何解决这个问题的任何线索?
编辑:好的,我想我隔离了这个问题。我正在使用 Agner Fog 的矢量类,并将三个源文件定义为:
这崩溃了。如果我改为在 func_SSE2 中使用 Vec4f 它不会崩溃。我不明白这一点。只要我没有另一个带有 AVX 的源文件,我就可以单独使用 Vec8f 和 SSE2。阿格纳雾的手册说
“除非指定了 AVX 指令集,否则使用 256 位浮点向量类(Vec8f、Vec4d)没有任何优势,但如果在有和没有 AVX 的情况下使用相同的源代码,则无论如何使用这些类会很方便。在没有 AVX 的情况下编译时,每个 256 位向量将简单地分成两个 128 位向量。”
但是,当我有两个使用 Vec8f 的源文件时,一个使用 SSE2 编译,一个使用 AVX 编译,然后我会崩溃。
Edit2:我可以从命令行让它工作
Edit3:但是,这会崩溃
另一个线索。显然,链接的顺序很重要。如果 avx.obj 在 sse2.obj 之前它会崩溃,但如果 sse2.obj 在 avx.obj 之前它不会崩溃。我不确定它是否选择了正确的代码路径(我现在无法访问我的 AVX 系统),但至少它不会崩溃。
c++ - 用 AVX 乘法
请这是我第一次使用 AVX,我正在尝试对双精度数字执行简单的乘法,但我没有得到所有结果正确。
我只得到前 4 个结果,其他的都是行话。
c - 通过 SSE/AVX 使用 OpenMP 减少
我想使用 OpenMP 和 SIMD 对数组进行缩减。我读到 OpenMP 的减少相当于:
我从以下链接得到了这个想法:http: //bisqwit.iki.fi/story/howto/openmp/#ReductionClause 但是原子也不支持复杂的运算符。我所做的是将 atomic 替换为 critical 并使用 OpenMP 和 SSE 实现缩减,如下所示:
然而,这个功能并没有我希望的那么好。我正在使用 Visual Studio 2012 Express。我知道我可以通过展开 SSE 加载/添加几次来稍微提高性能,但这仍然低于我的预期。
通过运行等于线程数的数组切片,我获得了更好的性能:
}
有人知道是否有更好的方法来减少 OpenMP 中更复杂的运算符?
cpu - 沙桥和 haswell SSE2/AVX/AVX2 的每周期 FLOPS
我对使用 Sandy-Bridge 和 Haswell 可以在每个核心每个周期完成多少次触发器感到困惑。据我了解,对于 SSE,对于 SSE,每个内核每个周期应该有 4 个触发器,对于 AVX/AVX2,每个内核每个周期应该是 8 个触发器。
这似乎在这里得到验证, 如何实现每个周期 4 次 FLOP 的理论最大值? ,这里是 Sandy-Bridge CPU 规范。
然而,下面的链接似乎表明 Sandy-bridge 每个内核每个周期可以执行 16 次触发器,Haswell 每个内核每个周期可以执行 32 次触发器 http://www.extremetech.com/computing/136219-intels-haswell-is-an-unprecedented -威胁到 nvidia-amd。
谁可以给我解释一下这个?
编辑:我现在明白为什么我感到困惑了。我认为术语 FLOP 仅指单浮点 (SP)。我现在看到如何实现每个周期 4 次 FLOP 的理论最大值的测试?实际上是在双浮点 (DP) 上,因此它们实现了 SSE 的 4 DP FLOP/周期和 AVX 的 8 DP FLOP/周期。在 SP 上重做这些测试会很有趣。
sse - SSE 和 AVX 的 SIMD 数学库
我正在寻找 SSE 和 AVX 的 SIMD 数学库(最好是开源的)。我的意思是,例如,如果我有一个带有 8 个浮点值的 AVX 寄存器 v,我希望 sin(v) 一次返回所有八个值的 sin。
AMD 有一个专有库 LibM http://developer.amd.com/tools/cpu-development/libm/,它有一些 SIMD 数学函数,但 LibM 只有在检测到英特尔 CPU 没有的 FMA4 时才使用 AVX。此外,我不确定它是否完全使用 AVX,因为所有函数名称都以 s4 (d2) 而不是 s8 (d4) 结尾。它比 Intel CPU 上的标准数学库提供更好的性能,但也好不了多少。
英特尔将 SVML 作为其 C++ 编译器的一部分,但编译器套件在 Windows 上非常昂贵。此外,英特尔会削弱非英特尔 CPU 上的库。
我找到了以下 AVX 库http://software-lisc.fbk.eu/avx_mathfun/,它支持一些数学函数(exp、log、sin、cos 和 sincos)。它为我提供了非常快的结果,比 SVML 更快,但我没有检查准确性。它仅适用于单浮点,在 Visual Studio 中不起作用(尽管这很容易修复)。它基于另一个 SSE 库。
有没有人有任何其他建议?
编辑:我找到了一个 SO 线程,它在 C 中对这个主题 Vectorized Trig 函数有很多答案?