C++ 内部存储-性能差

C++ 内部存储-性能差,c++,intrinsics,xeon-phi,C++,Intrinsics,Xeon Phi,我想为Xeon Phi(60核)编写基准测试。在我的程序中,我使用OpenMP标准和Intel Intrinsic。我实现了并行版本的算法(5点模板计算),比标量算法快230倍。我想将SIMD添加到并行代码中。我的表现有问题。当我调用_m512_store_pd()时,计算性能会降低,使用SIMD的并行版本比不使用SIMD的版本慢。有什么问题?我应该怎么做才能获得更好的性能 for(int i=start; i<stop; i+=threadsPerCore) {

我想为Xeon Phi(60核)编写基准测试。在我的程序中,我使用OpenMP标准和Intel Intrinsic。我实现了并行版本的算法(5点模板计算),比标量算法快230倍。我想将SIMD添加到并行代码中。我的表现有问题。当我调用_m512_store_pd()时,计算性能会降低,使用SIMD的并行版本比不使用SIMD的版本慢。有什么问题?我应该怎么做才能获得更好的性能

for(int i=start; i<stop; i+=threadsPerCore)
        {
            for(int j=8; j<n+8; j+=8)
            {
               __m512d v_c = _mm512_load_pd(&matrixIn[i * n_real + j]);
               __m512d v_g = _mm512_load_pd(&matrixIn[(i - 1) * n_real + j]);
               __m512d v_d = _mm512_load_pd(&matrixIn[(i + 1) * n_real + j]);
               __m512d v_l = _mm512_loadu_pd(&matrixIn[i * n_real + (j - 1)]);
               __m512d v_p = _mm512_loadu_pd(&matrixIn[i * n_real + (j + 1)]);

               __m512d v_max = _mm512_max_pd(v_c, v_g);
               v_max = _mm512_max_pd(v_max, v_d);
               v_max = _mm512_max_pd(v_max, v_l);
               v_max = _mm512_max_pd(v_max, v_p);

              _mm512_store_pd(&matrixOut[i * n_real + j], v_max);
            }
}
for(int i=start;i似乎有人(可能是你)在英特尔开发者专区问了一个相同的问题(至少,引用的代码示例与你的相同),在那里有答案(包括性能提高40%的重写)

也许读这本书会有用


(如果是你,我不反对在这两个地方提问,但礼貌的做法是告诉这里的人你已经在那里提问了,这样他们就不会浪费时间重复别人在其他论坛上已经给出的答案).

你能不能组织好你的数据,这样数据就可以根据结果进行调整?我不知道这些天是怎么回事,但使用未对齐的存储来流式处理数据是很糟糕的。除此之外,我不知道o建议了什么。你看了编译器首先生成的代码了吗?gcc和clang都倾向于生成非常好的数据ent SIMD代码,只要编译器足够了解正在发生的事情以及如何翻译它-这看起来并不复杂。这是错误的。我不使用“storeu”内在函数将数据写入内存。矩阵matrixIn和matrixOut都与64字节对齐。使用“storeu”我复制代码的时候一定是出错了。对不起,我用:icc-mmic-O3-openmpWell编译程序,我没有一台机器有正确的指令集,也没有icc(我曾经为AMD工作,但出于一些原因,我仍然不为自己的机器购买Intel CPU,而我当前的机器是使用更旧处理器的备份,因为我的另一台机器有点过时)。我仍然会检查编译器实际生成的代码-完全可能您的内部函数与编译器已经生成的几乎相同,因此“没有区别”-我不止一次看到gcc和clang,icc应该很好。Tommorow我用生成汇编代码的标志编译程序,我会看看它是如何工作的,我的编译器是如何翻译这个intrisic的。也许它会解决我的问题。我编译代码,我看到了一个汇编文件。intrisic翻译得很好。但我还是不知道问题出在哪里。