我正在使用以下处理器 i7 在 MacOS 上进行矢量化基准测试:
$ sysctl -n machdep.cpu.brand_string
Intel(R) Core(TM) i7-4960HQ CPU @ 2.60GHz
我的 MacBook Pro 是 2014 年中期的。
我尝试使用不同的标志选项进行矢量化:我感兴趣的 3 个选项是 SSE、AVX 和 AVX2。
对于我的基准测试,我添加了 2 个数组的每个元素并将总和存储在第三个数组中。
我必须让你注意到我正在使用double
这些数组的类型。
以下是我的基准代码中使用的函数:
1*) 首先使用 SSE 矢量化:
#ifdef SSE
#include <x86intrin.h>
#define ALIGN 16
void addition_tab(int size, double *a, double *b, double *c)
{
int i;
// Main loop
for (i=size-1; i>=0; i-=2)
{
// Intrinsic SSE syntax
const __m128d x = _mm_load_pd(a); // Load two x elements
const __m128d y = _mm_load_pd(b); // Load two y elements
const __m128d sum = _mm_add_pd(x, y); // Compute two sum elements
_mm_store_pd(c, sum); // Store two sum elements
// Increment pointers by 2 since SSE vectorizes on 128 bits = 16 bytes = 2*sizeof(double)
a += 2;
b += 2;
c += 2;
}
}
#endif
2*) 第二个使用 AVX256 矢量化:
#ifdef AVX256
#include <immintrin.h>
#define ALIGN 32
void addition_tab(int size, double *a, double *b, double *c)
{
int i;
// Main loop
for (i=size-1; i>=0; i-=4)
{
// Intrinsic AVX syntax
const __m256d x = _mm256_load_pd(a); // Load two x elements
const __m256d y = _mm256_load_pd(b); // Load two y elements
const __m256d sum = _mm256_add_pd(x, y); // Compute two sum elements
_mm256_store_pd(c, sum); // Store two sum elements
// Increment pointers by 4 since AVX256 vectorizes on 256 bits = 32 bytes = 4*sizeof(double)
a += 4;
b += 4;
c += 4;
}
}
#endif
对于 SSE 矢量化,我预计 Speedup 大约等于 2,因为我在 128 位 = 16 字节 = 2* sizeof(double) 上对齐数据。
我得到的 SSE 矢量化结果如下图所示:
所以,我认为这些结果是有效的,因为 SpeedUp 大约是因子 2。
现在对于 AVX256,我得到下图:
对于 AVX256 矢量化,我预计 Speedup 大约等于 4,因为我在 256 位 = 32 字节 = 4* sizeof(double) 上对齐数据。
但正如你所看到的,我仍然得到一个factor 2
而不是4
SpeedUp。
我不明白为什么使用 SSE 和 AVX 矢量化的 Speedup 得到相同的结果。
它是否来自“编译标志”,来自我的处理器型号,......我不知道。
这是我为上述所有结果所做的编译命令行:
上证所:
gcc-mp-4.9 -DSSE -O3 -msse main_benchmark.c -o vectorizedExe
对于 AVX256:
gcc-mp-4.9 -DAVX256 -O3 -Wa,-q -mavx main_benchmark.c -o vectorizedExe
此外,对于我的处理器模型,我可以使用 AVX512 矢量化吗?(一旦这个问题的问题将得到解决)。
谢谢你的帮助
更新 1
我尝试了不同的选项,@Mischa
但仍然无法使用 AVX 标志和选项获得 4 倍的加速。您可以在http://example.com/test_vectorization/main_benchmark.c.txt上查看我的 C 源代码(带有 .txt 扩展名,以便直接查看浏览器),用于基准测试的 shell 脚本是http://example.com /test_vectorization/run_benchmark。
正如@Mischa 所说,我尝试应用以下命令行进行编译:
$GCC -O3 -Wa,-q -mavx -fprefetch-loop-arrays main_benchmark.c -o vectorizedExe
但生成的代码没有 AVX 指令。
如果你能看看这些文件,那就太好了。谢谢。