gpt4 book ai didi

sse - 使用 Haswell 架构的并行编程

转载 作者:行者123 更新时间:2023-12-04 09:05:18 27 4
gpt4 key购买 nike

关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。












想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。

7年前关闭。




Improve this question




我想了解使用 Intel 的 Haswell CPU 微体系结构的并行编程。
关于使用 SIMD: SSE4.2, AVX2 in asm/C/C++/(any other langs)?。
你能推荐书籍、教程、互联网资源、类(class)吗?

谢谢!

最佳答案

在我看来,您需要了解一般 CPU 上的并行编程。在我使用 SSE、OpenMP 或内在函数之前,我大约在 10 个月前开始研究这个问题,所以让我简要总结一下我学到的一些重要概念和一些有用的资源。

可以采用多种并行计算技术: MIMD、SIMD、指令级并行、多级缓存和 FMA .有了 Haswell,IGP 也有了计算。

我建议选择一个主题,如矩阵乘法或 Mandelbrot 集。他们都可以从所有这些技术中受益。

MIMD

MIMD 我指的是使用多个物理内核的计算。我为此推荐 OpenMP。通过本教程
http://bisqwit.iki.fi/story/howto/openmp/#Abstract
然后将此用作引用 https://computing.llnl.gov/tutorials/openMP/ .使用 MIMD 的两个最常见问题是 race conditionsfalse sharing .定期在 SO 上关注 OpenMP。

SIMD

许多编译器可以进行自动矢量化,所以我会研究一下。 MSVC 的自动矢量化非常原始,但 GCC 的非常好。

学习内功。了解内在函数的最佳资源是 http://software.intel.com/sites/landingpage/IntrinsicsGuide/

另一个很棒的资源是 Agner Fog 的 vectorclass . SSE/AVX上关于SO的95%的问题,通过查看vectorclass的源代码,都可以得到解答。最重要的是,您可以对大多数 SIMD 使用向量类,并且仍然可以获得全速并跳过内在函数。

许多人低效地使用 SIMD。阅读结构数组 (AOS) 和数组结构 (SOA) 以及数组结构数组 (AOSOA)。也看看英特尔条采矿Calculating matrix product is much slower with SSE than with straight-forward-algorithm

Ingo Wald's PhD thesis以一种有趣的方式在光线追踪中实现 SIMD。我对 Mandelbrot 集使用了同样的想法,使用 SSE(AVX) 一次计算 4(8) 个像素。

另请阅读 Wald 的这篇论文“Extending a C-like Language for Portable SIMD Programming” http://www.cdl.uni-saarland.de/papers/leissa_vecimp_tr.pdf更好地了解如何使用 SIMD。

FMA

FMA3 自 Haswell 以来是新的。它太新了,所以在 SO 上还没有太多讨论。但是这个答案(对我的问题)很好
How to use Fused Multiply-Add (FMA) instructions with SSE/AVX . FMA3 将峰值 FLOPS 加倍,因此与 Ivy Bridge 相比,Haswell 上的矩阵乘法可能快两倍。

根据 this answer FMA 最重要的方面不是它是一条指令而不是两条指令来进行乘法和加法,而是“中间结果的(几乎)无限精度”。例如,在没有 FMA 的情况下实现双倍乘法需要 6 次乘法和几次加法,而使用 FMA 则只有两次运算。

指令级并行

Haswell 有 8 个可以向其发送 μ-ops 的端口(尽管并非每个端口都可以采用相同的 mirco-op;请参阅此 AnandTech review)。这意味着 Haswell 可以做到,例如 two 256-bit loads, one 256-bit store, two 256-bit FMA operations, one scalar addition, and a condition jump at the same time (每个时钟周期六个 μ-op)。

在大多数情况下,您不必担心这一点,因为它是由 CPU 完成的。但是,在某些情况下,您的代码可能会限制潜在的指令级并行性。最常见的是循环携带依赖。下面的代码有一个循环携带的依赖

for(int i=0; i<n; i++) {
sum += x(i)*y(i);
}

解决这个问题的方法是展开循环并进行部分求和
for(int i=0; i<n; i+=2) {
sum1 += x(i)*y(i);
sum2 += x(i+1)*y(i+1);
}
sum = sum1 + sum2;

多级缓存:

Haswell 有多达四级缓存。在我看来,编写代码以最佳地利用缓存是迄今为止最困难的挑战。这是我仍然最纠结和最无知的话题,但在许多情况下,提高缓存使用率比任何其他技术都提供更好的性能。我对此没有太多建议。

您需要了解集合和缓存行(以及关键步幅)以及有关页面的 NUMA 系统。要了解有关集合和关键步幅的一些知识,请参阅 Agner Fog 的 http://www.agner.org/optimize/optimizing_cpp.pdf而这个 Why is transposing a matrix of 512x512 much slower than transposing a matrix of 513x513?

另一个非常有用的缓存主题是循环阻塞或平铺。在 What is the fastest way to transpose a matrix in C++? 上查看我的回答(得票最高的那个)举个例子。

在 IGP 上计算(使用 Iris Pro) .

所有 Haswell 消费者处理器(Haswell-E 尚未推出)都有一个 IGP。 IGP 使用至少 30% 到 50% 以上的硅。这对于至少 2 个以上的 x86 内核来说已经足够了。对于大多数程序员来说,这浪费了计算潜力。对 IGP 进行编程的唯一方法是使用 OpenCL。英特尔没有适用于 Linux 的 OpenCL Iris Pro 驱动程序,因此您只能使用 Windows(我不确定 Apple 对此的实现有多好)。 Programming Intel IGP (e.g. Iris Pro 5200) hardware without OpenCL .

与 Nvidia 和 AMD 相比,Iris Pro 的优势之一是双浮点数仅为 one quarter the speed of single floating point with the Iris Pro (however fp64 is only enabled in Direct Compute and not with OpenCL) . NVIDIA 和 AMD(最近)严重削弱了双浮点数,以至于 GPGPU 双浮点计算在他们的消费卡上不是很有效。

关于sse - 使用 Haswell 架构的并行编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20933746/

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