我想为 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 线程计算。