2

我想为 Xeon Phi(60 核)编写基准测试。在我的程序中,我使用 OpenMP 标准和 Intel 内在函数。我实现了算法的并行版本(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。开始和停止是计算的,因为 60 核的 i 分区矩阵和 opne 部分 (m/60) 由 4 个 HM 线程计算。

4

1 回答 1

0

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

也许阅读会有用?

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

于 2014-09-26T08:18:15.823 回答