gpt4 book ai didi

arrays - 向量化二维数组访问 (GCC)

转载 作者:行者123 更新时间:2023-12-01 02:08:13 25 4
gpt4 key购买 nike

我了解矢量化的基本思想。我正在考虑将我的一个程序转换为矢量化版本。但是好像很复杂。

有一个表(二维数组)table[M][N] , 和两个向量 X[1..4]Y[1..4] .可以进行以下操作吗?有什么想法吗?

X[1..4] = table[X[1..4]][Y[1..4]]

(顺序版本: X[i] = table[X[i]][Y[i]])

换句话说,以下循环可以向量化吗?
    for(k=0; k<4; k++) {
tmp1 = X[k];
tmp2 = Y[k];
X[k] = table[tmp1][tmp2];
}

注: X[]总是包含不同的值 .

目前,它是用C语言实现的。

最佳答案

1) 从技术上讲,hayesti 已经回答了您的问题(在 AVX2 上的 vgather 的 SSE/AVX 上的插入/水平说明将使其成为可能)。但还要注意,GCC4.9 和 ICC 都会对给定的代码片段进行矢量化(因此对于真正的随机访问不需要内在函数/手动编码),尽管对于 GCC,您可能需要 #pragma omp simd,并且您可能还需要-vec-threshold0 用于 SSE 机器上的 ICC。

2) 实际上,如果您必须“按原样”对给定代码进行矢量化,则永远不会有很好的加速效果,因为您需要使用足够的矢量计算(您不需要)“摊销” vgather 或 vinsert-s 的大开销(延迟)在您的示例中)使矢量化“有利可图”。并且无需说您还需要适当的循环行程计数等。

我刚刚使用一种新的 ICC 编译器 report 检查了代码矢量化版本的静态成本模型估计。 (或“Intel Vectorization Advisor”)输出。

  • 对于 上证所代码生成是: 0.5x (即减速)
  • 对于 AVX 代码生成是: 1.1x 加速(作为上限)
  • 对于 AVX2 代码生成是: 1.3 倍 - 1.4 倍 加速(作为上限)。

  • 现在,请记住,所有这些加速都是由非常好的优化编译器提供的乐观上限(我不知道 GCC 会更好还是更糟)。根据您的索引布局、矩阵大小和整体带宽-延迟平衡以及其他一些原因 - 即使对于 AVX2,您通常也会低于 1.4 倍,几乎不会期望显着加速。为了使这种访问模式真正有利可图,您需要在循环体中使用 X[k] 进行一些额外的(矢量化)计算来分摊开销(而不是仅仅将数据从一个地方复制到另一个地方)。

    同时,还有 好消息以及。短期 future AVX-512 机器(KNL Xeon Phi,一些 future 的 Xeon)vgather 性能可能会改变/改进,因此即使是简单的数据复制也可能提供一些额外的加速,但无论如何这不是你在今天的 AVX/AVX2 机器上观察到的。

    最后一个小注意事项:如果您处理稀疏矩阵(这就是您讲述给定间接引用的原因),那么您可能会想到稀疏数据压缩行存储格式,因此可能会考虑不同的 SIMD 权衡,尽管它太远了从问题的原始范围。

    关于arrays - 向量化二维数组访问 (GCC),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30972382/

    25 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com