问题标签 [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 指令。(GCC 内联汇编)
我们正在运行一个科学程序,我们希望实现 AVX 功能。整个程序(用 Fortran+C 编写)将被矢量化,目前我正在尝试在 GCC 内联汇编中实现复数乘法。
汇编代码接受 4 个复数并一次执行两个复数乘法:
其中 a 和 b 是 256 位双精度:
问题是代码大多会产生正确的结果,但有时会失败。
我对组装很陌生,但我试图自己弄清楚。似乎 C 程序(优化的 -O3)与ymm
汇编代码中使用的寄存器交互。例如,我可以在执行乘法之前打印其中一个值(例如 a),并且程序永远不会给出错误的结果。
我的问题是如何告诉 GCC 不要与 ymm 交互。我没有设法将被破坏的ymm
寄存器列表。
c - 如何在 SSE/AVX 中使用融合乘加 (FMA) 指令
我了解到,一些 Intel/AMD CPU 可以同时使用 SSE/AVX 进行乘法和加法:
sandy-bridge 和 haswell SSE2/AVX/AVX2 的每个周期的 FLOPS。
我想知道如何在代码中做到最好,我也想知道它是如何在 CPU 内部完成的。我的意思是超标量架构。假设我想在 SSE 中做一个很长的总和,如下所示:
我的问题是如何将其转换为同时乘法和加法?数据可以依赖吗?我的意思是 CPU 可以_mm_add_ps(sum, _mm_mul_ps(a1, b1))
同时执行还是乘法和加法中使用的寄存器必须是独立的?
最后,这如何适用于 FMA(与 Haswell)?是_mm_add_ps(sum, _mm_mul_ps(a1, b1))
自动转换成单条FMA指令还是微操作?
c++ - Intel AVX:为什么双精度浮点变量没有 256 位版本的点积?
在关于 SO 的另一个问题中,我们尝试(并成功)找到了一种替换 AVX 缺失指令的方法:
任何人都知道这条指令丢失的原因吗?部分答案在这里。
c++ - 使用 gcc 4.6.1 使用 mex 启用 AVX 指令
我想弄乱一些 AVX 内在函数。如果可能的话,我希望 gcc 专门使用 AVX,类似于/arch:AVX
在 Visual Studio 中。有没有办法在 gcc 和 mex 中做到这一点?
我尝试使用类似的东西:
mex -g -O $CFLAGS='$CFLAGS -march=corei7-avx' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o
但编译器说eval: 1: = -march=corei7-avx: not found
. 有谁知道我应该使用哪个标志以及如何让 mex 接受它?默认情况下,它似乎正在使用 SSE 指令(查看汇编输出,我看到了一些mulsd
s),但我不想将 SSE 与 AVX 混合,因为我在这里读到它可能会导致问题。
编辑1:
我正在使用带有 gcc 4.6.1 的 ubuntu 11.04。
编辑2:
编译:
mex CXXOPTIMFLAGS='-mtune=corei7-avx -S' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o
产量:
编译:
mex CXXOPTIMFLAGS='-mavx -S' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o
和mex CXXOPTIMFLAGS='-march=corei7-avx -S' ncorr_alg_rgdic.cpp standard_datatypes.o ncorr_datatypes.o
两者都产生:
现在我很确定mulsd
是 sse 指令。是vmulsd
AVX 指令(奇怪的是谷歌搜索它没有产生任何结果)?我也没有看到ymm
正在使用的寄存器,这很奇怪。
cpu - Intel E7 和 E5 Xeon 型号之间的区别?
我正在研究构建面向 HPC (FLOP) 计算的强大机器集群的可能性,因此我一直在审查顶级Intel Xeon 模型,并惊讶地发现 Xeon E7 模型不支持 AVX 矢量化,而 Xeon E5 支持. 另一方面,E7 支持 SSE 4.2,这似乎是一种与 FLOP 计算和 HPC 无关的优化,而是用于加速字符计算,例如 XML 解析。
为了确保我正确理解了差异,我想问一下 E7 Xeon 模型是否不支持 AVX 并且面向“系统”,而 E5 Xeon 模型支持 AVX 并且面向 HPC 密集型 FLOP 计算。
c++ - 执行 AVX 整数运算
我正在尝试使用 AVX 优化一些整数 (_int64) 操作。但是,我什至不能简单的添加操作。它一直告诉我非法指令。请问我可以纠正我做错了什么吗?谢谢
c++ - AVX 将 64 位整数转换为 64 位浮点数
我想使用 AVX 将 4 个压缩的 64 位整数转换为 4 个压缩的 64 位浮点数。我试过类似的东西:
这将显示在调试器中:
到目前为止还可以,但我能找到的唯一转换/转换操作是 _mm256i_castsi256_pd,它没有得到我想要的:
我真正想看到的是:
c++ - AVX中的6元素双精度向量矩阵向量乘法
我需要以双精度执行以下操作:
数字表示值如何存储在内存中。我想用 AVX 来实现这个。如果我[QK]
先将列填充到 8 个元素,然后执行矩阵向量乘法,然后再执行[x]
点[QK]
积,那会更好吗?
编辑:好的,所以我决定使用填充向量实现FLOAT 32 位版本,如下所示:
就目前而言,它的运行速度大约是以下的 3 倍:
对于 5 亿次迭代,标准 C 版本运行时间约为 9 秒,单精度 AVX 版本运行时间约为 3.5 秒。如果我在最后注释掉水平总和,那么它会在大约 0.5 秒内运行。水平总和真的扼杀了性能......
x86 - _mm256_testz_pd 不工作?
我正在 Linux 上开发 Core i7 并使用 g++ 4.63。
我尝试了以下代码:
它打印了 3 个 1。我期望其中至少有一个是 0。
我尝试使用_mm256_castpd_si256
然后_mm256_testz_si256
,它会在第一行打印 0。
为什么?
avx - 如何在 QNX Neutrino 6.5.0 上使用英特尔 AVX?
我最近开始使用 QNX 6.5.0,无法理解 QNX 如何使用英特尔 AVX 开发程序。使用 GCC 4.4.2 安装 QNX Development Studio 6.5.0,我正在尝试编写一个简单的程序,但构建失败。
错误:immitnrin.h:
在函数'int main(int,char**)'中没有这样的文件或目录:
错误:'__m256'未在此范围内声明
错误:预期';' 在'var'
错误之前:预期';' 在'var2'
错误之前:预期';' 在“结果”
错误之前:“var”未在此范围内声明
错误:“_mm256_set1_ps”未在此范围内声明
错误:“var2”未在此范围内声明
错误:“结果”未在此范围内声明
错误: '_mm256_add_ps' 未在此范围内声明
我如何以及在哪里可以了解如何在 QNX 中使用英特尔的 SIMD 指令?
更新
这是程序 make.exe 的输出:
make.exe -k CPULIST=x86 all --file=C:/DOCUME~1/Andrew/LOCALS~1/Temp/QMakefile.tmp C:/QNX650/host/win32/x86/usr/bin/make.exe - j 1 -Cx86 -fMakefile all
make.exe[1]:进入目录C:/ide-4.7-workspace/project_test_avx/x86/o'C:/ide-4.7-workspace/project_test_avx/x86'
C:/QNX650/host/win32/x86/usr/bin/make.exe -j 1 -Co -fMakefile all
make.exe[2]: Entering directory