我目前正在进行一些优化并比较DSP应用的矢量化可能性,这似乎是AVX512的理想选择,因为它们只是简单的不相关的阵列处理循环.但是在新的i9上,与AVX2相比,使用AVX512时没有任何合理的改进.有什么指针吗?有什么好结果吗?(顺便说一句.我试过MSVC/CLANG/ICL,没有明显的区别,很多时候AVX512代码实际上看起来比较慢)
这是我在 AVX512BW 中的“strlen”函数的代码
vxorps zmm0, zmm0, zmm0 ; ZMM0 = 0
vpcmpeqb k0, zmm0, [ebx] ; ebx is string and it's aligned at 64-byte boundary
kortestq k0, k0 ; 0x00 found ?
jnz .chk_0x00
Run Code Online (Sandbox Code Playgroud)
现在对于'chk_0x00',在x86_64系统中,没有问题,我们可以这样处理:
chk_0x00:
kmovq rbx, k0
tzcnt rbx, rbx
add rax, rbx
Run Code Online (Sandbox Code Playgroud)
这里我们有一个 64 位寄存器,因此我们可以将掩码存储到其中,但我的问题是关于 x86 系统,我们没有任何 64 位寄存器,因此我们必须使用“内存”保留(8 字节)并检查两者掩码的DWORD一一对应(其实这是我的方式,我想知道有没有更好的方式)
chk_0x00:
kmovd ebx, k0 ; move the first dword of the mask to the ebx
test ebx, ebx ; 0x00 found in the first dword ?
jz …
Run Code Online (Sandbox Code Playgroud) 该指令存在 ( vbroadcastss zmm/m32
) 但似乎没有生成它的内在指令。
我可以将其编码为
static inline __m512 mybroadcast(float *x) {
__m512 v;
asm inline ( "vbroadcastss %1,%0 "
: "=v" (v)
: "m" (*x)
);
return v;
}
Run Code Online (Sandbox Code Playgroud)
有没有办法在没有内联 asm 的情况下做到这一点?
在SIMD和并行化方面,AVX2和AVX-512有什么区别?它们是相同的还是不同的?我刚刚看到在 AVX-512 中使用了 double8,而在 AVX2 中使用了 double4?
我正在使用 PyOpenCL 用 C 编写内核代码,但不确定有什么区别。
我有一个使用静态库的 C/C++ 项目。该图书馆是为“skylake”建筑而建的。该项目是一个数据处理模块,即它执行许多算术运算、内存复制、搜索、比较等。
CPU为至强金牌6130T,支持AVX512。我试图编译我的项目既-march=skylake
和-march=skylake-avx512
,然后用链接库。
在使用-march=skylake-avx512
的情况下,与使用-march=skylake
.
这怎么解释?可能是什么原因?
信息:
我编译了以下示例代码:
#cat array_addition.c
#define MAX 1000000
#define S 1024
#include <string.h>
int a[S], b[S], c[S];
__attribute__((target_clones("avx512f", "avx2","arch=atom","default")))
void foo(int argc){
int i,x;
for (x=0; x<1024; x++){
for (i=0; i<S; i++){
a[i] = b[i] + c[i];
}
}
b[0] = argc;
memcpy(&a[0], &b[0], argc *sizeof(int));
}
int main(int argc, char** argv) {
foo(argc);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
其中调用 memcpy;
从 objdump 中,我们可以发现它会调用 GLIBC memcpy:
#readelf -r a.out
Relocation section '.rela.dyn' at offset 0x418 contains 1 entry:
Offset Info Type Sym. Value Sym. …
Run Code Online (Sandbox Code Playgroud) 我只是在Xeon Phi处理器中读取AVX内置的AVX512集,但似乎sse中的传统数据类型转换方法在avx512中不起作用,所以我可以问一下avx512中是否有任何类似的cpu设置可以转换unsigned char数组到短数据类型数组?提前致谢!
在 Xcode(Version 10.1 (10B61)) 中,我使用如下宏来检测 AVX512 支持。
#ifdef __SSE4_1__
#error "sse4_1"
#endif
#ifdef __AVX__
#error "avx"
#endif
#ifdef __AVX2__
#error "avx2"
#endif
#ifdef __AVX512__
#error "avx512"
#endif
Run Code Online (Sandbox Code Playgroud)
在默认构建设置中,SSE4_1处于活动状态,但 avx、avx2 未处于活动状态。当我在 Building Settings-->Apple Clang-Custom Compiler Flags-->Other C Flags 中添加-mavx时,启用AVX,进一步添加-mavx2以启用AVX和AVX2,但未知参数:'-mavx512'。你如何启用avx512并检测它?似乎很少有宏来检测avx512。
#define __AVX512BW__ 1
#define __AVX512CD__ 1
#define __AVX512DQ__ 1
#define __AVX512F__ 1
#define __AVX512VL__ 1
Run Code Online (Sandbox Code Playgroud)
它们之间有什么区别?
在尝试学习Coursera 上的课程时,我尝试为我的 CPU 优化示例 C++ 代码Intel i5-8259U
,我相信它支持AVX2
SIMD 指令集。现在,AVX2
每个内核提供 16 个寄存器(称为YMM0
, YMM1
, ..., YMM15
),宽度为 256 位,这意味着每个内核最多可以同时处理 4 个双精度浮点数。利用AVX2
SIMD 指令应该可以优化我的代码,使其运行速度比标量指令快 4 倍。
在链接的课程中,您可以尝试在Intel Xeon Phi 7210 (Knights Landing)
支持AVX512
使用 512 位宽寄存器的处理器上运行相同的数值积分代码。这意味着我们应该期望双精度运算的速度提高 8 倍。实际上,讲师使用的代码获得了高达 14 倍的优化,几乎是 8 的 173%。额外的优化归功于 OpenMP。
为了在我的 CPU 上运行相同的代码,我唯一改变的是传递给英特尔编译器的优化标志:-xMIC-AVX512
我使用了 ,而不是-xCORE-AVX2
。我获得的加速仅为 2 倍,仅是由于 256 位寄存器上的 SIMD 矢量化而产生的预期加速的 50%。将此 50% 与英特尔至强融核处理器上获得的 173% 进行比较。
为什么我仅仅从 转到 就看到性能的巨大AVX512
损失AVX2
?当然,除了 …
你好我试图建立一个没有任何avx512指令通过使用这些标志:
-march=native -mno-avx512f
。但是,我仍然得到一个二进制文件,其中vmovss
生成了AVX512 ( ) 指令(我正在使用 elfx86exts 进行检查)。知道如何禁用这些吗?