复杂的存储-性能不好

Intrisic store - bad performance

本文关键字:性能 存储 复杂      更新时间:2023-10-16

我想为Xeon Phi(60核)编写基准测试。在我的程序中,我使用OpenMP标准和英特尔内部函数。我实现了并行版本的算法(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);
            }
}

我从8开始计算,因为我有一个向量在开始,一个矢量在结束,是晕元素。n_real是向量的大小->n+16。计算了启动和停止,因为i是60个核的划分矩阵,opne部分(m/60)由4个HM线程计算。

似乎有人(可能是您)在英特尔开发区上问了一个相同的问题(至少,引用的代码示例与您的相同)https://software.intel.com/en-us/forums/topic/531721哪里有答案(包括一次重写,性能提高了40%)。

也许读一下会有用?

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