复杂的存储-性能不好
Intrisic store - bad performance
我想为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%)。
也许读一下会有用?
(如果是你,我不反对在两个地方都问,但礼貌地告诉这里的人你已经在那里问过了,这样他们就不会浪费时间重复别人在另一个论坛上已经给出的答案)。
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 将字符串存储在c++中的稳定内存中
- std::原子加载和存储都需要吗
- C++:将控制台输出存储在宏中更好吗
- OpenMP阵列性能较差
- 递归列出所有目录中的C++与Python与Ruby的性能
- 使用QProcess执行命令,并将结果存储在QStringList中
- 大小相等但成员数量不同的结构之间的性能差异
- 访问存储在向量C++中的结构的多态成员
- 如何从存储在std::映射中的std::集中删除元素
- 为什么constexpr的性能比正常表达式差
- 存储模板类型以强制转换回派生<T>
- 类型总是使用其大小存储在内存中吗
- 检查基于磁盘的合并与辅助存储的性能
- 几对性能问题(一个较大的向量与较小的块向量),值得存储迭代索引以进行矢量访问
- 我们是否应该将指向类实例的智能指针存储在大型 std::vector 中以获得更好的性能?
- 提高 std::vector 的存储容量/性能
- 复杂的存储-性能不好
- 如何提高具有100万个元素和997个存储桶的哈希表的性能
- 大型3D阵列的性能:连续1D存储与T***