问题标签 [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.
x86 - 开发新的指令集
英特尔将发布一个名为AVX的新指令集,其中包括将 SSE 扩展到 256 位操作。即,4 个双精度元素或 8 个单精度元素。
考虑到目前还没有支持它的硬件,如何为 AVX 开发代码?更一般地说,开发人员如何为不存在的硬件编写代码,例如,如果他们希望在支持 CPU 发布时准备好软件?
x86 - 目前哪些汇编程序支持 AVX 指令集?
我想开始玩一些 AVX(高级矢量扩展)指令。我知道英特尔提供了一个模拟器来测试包含这些指令的软件(请参阅这个问题),但是由于我不想手动编写十六进制代码,所以问题是哪些汇编程序当前知道 AVX 指令集?
我对在 Windows 下运行并且可以接受 Intel 语法的汇编程序最感兴趣。
c++ - 英特尔 AVX 内在函数:有任何兼容性库吗?
是否有任何英特尔 AVX 内在函数库?如果 SSE2 整数内在函数在编译时不可用,我正在寻找类似于 'sse2mmx.h' 标头的东西,它会回退到 MMX 内在函数。因此,如果我有类似的 AVX 库,我可以为新硬件编写优化代码,在 AVX 扩展不可用的情况下,这将具有几乎最佳的速度。到目前为止,谷歌搜索并没有太大帮助:(
x86 - C++ 中 SSE/AVX 的 x86 CPU 调度
我有一个算法,它受益于 SSE(2) 内在函数的手动优化。此外,该算法未来还将能够受益于 256 位 AVX 寄存器。
我的问题是什么是最好的方法
- 在编译时注册我的类的可用性变体;因此,如果我的类是:
Foo
,FooSSE2
并且FooAVX
我需要一种方法来确定在运行时编译了哪些类。 - 确定当前 CPU 的能力。在最低级别,这将导致
cpuid
调用。 - 在运行时根据编译的内容和支持的内容决定使用什么。
虽然我可以破解上述大部分内容,但它似乎是一个足够常见的问题,必须出现一些最佳实践。理想情况下,我试图避免#ifdef
混乱
xcode - Xcode 4 是否支持 AVX?
在我花时间和金钱下载 Xcode 4 之前,谁能告诉我它是否带有支持 Sandy Bridge CPU(即gcc -mavx
主流 gcc 构建)上的 AVX 指令集的 gcc 版本(或任何其他编译器,例如 LLVM)?我在任何地方都没有看到任何公开的发布说明,因此不容易检查,而且我还不需要 Xcode 4,除非它支持 AVX。
gpu - 如果您的主板不包含视频卡,您可以在 i5 2600K 上使用 AVX 指令吗?
从我读过的所有内容来看,如果 i5 2500K 处理器检测到外部 GPU,它就会禁用它的集成显卡。我的主板没有集成视频端口,所以我必须添加 PCI 视频卡。我找不到任何没有专用 GPU 的视频卡。这是否意味着为了使用 AVX 指令,您必须使用带有板载视频的主板?
visual-c++ - 使用 AVX 指令会禁用 exp() 优化?
我正在使用 AVX 内在函数在 VC++ 中编写前馈网络。我通过 C# 中的 PInvoke 调用此代码。我在调用计算包含函数 exp() 的大循环的函数时的性能约为 1000 毫秒,循环大小为 160M。一旦我调用任何使用 AVX 内在函数的函数,然后使用 exp(),对于相同的操作,我的性能下降到大约 8000 毫秒。请注意,计算 exp() 的函数是标准 C 语言,使用 AVX 内部函数的调用在处理的数据方面可能完全不相关。某种标志在运行时某处被绊倒。
换句话说,
或者,奇怪的是,
我不知道这里发生了什么可能的机制,或者如何寻求解决方案。我在 Intel 2500K cpu\Win 7. Express 版本的 VS 上。
谢谢。
gcc - 与 GCC 中的向量类型 __m128、__m256 重载冲突
我已经开始在新的英特尔 Sandy Bridge 处理器上使用 AVX 指令。我正在使用 GCC 4.5.2,TDM-GCC 64 位版本的 MinGW64。
我想重载 operator<< 以便 ostream 能够将向量类型等打印__m256
到__m128
控制台。但是我遇到了超载冲突。以下代码中的第二个函数产生错误“与先前声明冲突void f(__vector(8) float)
”:
似乎编译器无法区分这两种类型并同时考虑它们f(float __vector)
。
有没有解决的办法?我一直无法在网上找到任何东西。任何帮助是极大的赞赏。
gcc - 如何强制 gcc 使用所有 SSE(或 AVX)寄存器?
我正在尝试使用 SSE 或新的 AVX 指令为 Windows x64 目标编写一些计算密集型代码,在 GCC 4.5.2 和 4.6.1、MinGW64(TDM GCC 构建和一些自定义构建)中编译。我的编译器选项是-O3 -mavx
. (-m64
暗示)
简而言之,我想对 4 个打包浮点数的 3D 向量执行一些冗长的计算。这需要 4x3=12 xmm 或 ymm 寄存器用于存储,以及 2 或 3 个寄存器用于临时结果。恕我直言,这应该恰好适合 64 位目标可用的 16 个可用 SSE(或 AVX)寄存器。然而,GCC 产生了一个非常次优的带有寄存器溢出的代码,只使用寄存器xmm0-xmm10
并将数据从堆栈中移入和移入堆栈。我的问题是:
有没有办法说服 GCC 使用所有的寄存器xmm0-xmm15
?
要修正想法,请考虑以下 SSE 代码(仅用于说明):
这里vect<__m128>
只是简单的 a struct
of 3 __m128
,通过标量进行自然加法和乘法运算。当该行a2 -= v
被注释掉时,即我们只需要 3x3 寄存器来存储,因为我们忽略a2
了 ,生成的代码确实很简单,没有移动,一切都在寄存器中执行xmm0-xmm10
。当我删除评论a2 -= v
时,代码非常糟糕,寄存器和堆栈之间有很多改组。即使编译器可以只使用寄存器xmm11-xmm13
或其他东西。
实际上,我还没有看到 GCCxmm11-xmm15
在我的所有代码中的任何地方使用任何寄存器。我究竟做错了什么?我知道它们是被调用者保存的寄存器,但是通过简化循环代码,这种开销是完全合理的。
gcc - 如何在 GCC 中以 32 字节边界对齐堆栈?
我正在为 Windows 64 位目标使用基于 GCC 4.6.1 的 MinGW64 构建。我正在玩新的英特尔 AVX 指令。我的命令行参数是-march=corei7-avx -mtune=corei7-avx -mavx
.
但是在堆栈上分配局部变量时,我开始遇到分段错误错误。GCC 使用对齐的移动和VMOVAPS
来回移动,这些指令需要 32 字节对齐。但是,Windows 64 位的堆栈只有 16 字节对齐。VMOVAPD
__m256
__m256d
如何将 GCC 的堆栈对齐更改为 32 字节?
我曾尝试使用-mstackrealign
但无济于事,因为它仅与 16 个字节对齐。我也无法__attribute__((force_align_arg_pointer))
工作,无论如何它都对齐到 16 个字节。我无法找到任何其他可以解决此问题的编译器选项。任何帮助是极大的赞赏。
编辑:
我尝试使用-mpreferred-stack-boundary=5
,但 GCC 说此目标不支持 5 。我没主意了。