【问题标题】:What value of alignment should I with mkl_malloc?我应该使用 mkl_malloc 进行什么对齐值?
【发布时间】:2018-08-03 01:06:10
【问题描述】:

函数mkl_malloc 类似于malloc,但有一个额外的alignment 参数。这是原型:

void* mkl_malloc (size_t alloc_size, int alignment);

我注意到alignment 的不同值的不同表现。除了反复试验之外,是否有规范或记录有条不紊的方法来确定alignment 的最佳价值?即正在使用的处理器、正在调用的函数、正在执行的操作等。

这个问题广泛适用于任何使用 MKL 的人,所以我很惊讶它不在参考手册中。

更新:我已尝试使用 mkl_sparse_spmm,但没有注意到将对齐设置为 2 到 1024 字节的幂的性能有显着差异,之后性能趋于下降。我使用的是英特尔至强 E5-2683。

【问题讨论】:

  • 这个回答对上一个问题有帮助吗? stackoverflow.com/a/6705570/1212725
  • 谢谢,但不是。我想知道对于给定的操作和硬件,对齐的什么值会给我带来最佳性能。
  • 直觉上,对齐似乎应该与处理器的字长相匹配。您看到了什么结果?
  • 谢谢!我发现 2 到 1024 的幂给出了非常相似的性能......但我一直在尝试受内存访问限制的稀疏操作。我将再次尝试密集操作。
  • 一般情况下可以使用_Alignof(max_align_t)。但是,这实际上取决于数据的类型。在当前的 x86-64 上,_Alignof(max_align_t) == 16,但 AVX512 向量需要64,而 AVX2 向量需要32

标签: c linear-algebra memory-alignment blas intel-mkl


【解决方案1】:

仅当可以使用 SSE/AVX 指令时,对齐才会影响性能 - 当您希望将相同的操作应用于一系列元素时,这通常会在使用数组时发生。

一般来说,你要根据CPU来选择对齐方式,如果它支持256bit寄存器的AVX2,那么你想要32字节对齐,如果它支持AVX512,那么64字节是最佳的。

为此,mkl_malloc 将保证与您指定的值对齐,但是,显然,如果数据是 32 字节对齐的,那么它们也会与 (16, 8, 4...) 字节对齐边界。调用的目的是确保始终如此,从而避免任何潜在的并发症。

在我的机器上(在 i7 6700K 上运行的 Linux 内核 4.17.11),mkl_malloc 的默认对齐方式似乎是 128 字节(对于足够大的数组,如果它们太小,值似乎是 32KB),换句话说,任何小于该值的值都不会影响对齐,但是我可以输入 256 并且数据将对齐到 256 字节的边界。

相比之下,使用malloc 为我提供了 1GB 数据的 16 字节对齐和 1KB 的 32 字节对齐,无论操作系统给我什么,我对对齐绝对没有偏好。

所以使用mkl_malloc 是有意义的,因为它可以确保您获得所需的对齐方式。但是,这并不意味着您应该将该值设置得太大,这只会导致您浪费内存并可能使您面临更多的缓存未命中。

简而言之,您希望数据与 CPU 中向量寄存器的大小对齐,以便您可以使用相关的扩展。使用带有一些对齐参数的mkl_malloc 可以保证与至少该值对齐,但是它可以更多。应该使用它来确保数据按照您想要的方式对齐,但绝对没有充分的理由对齐到 1MB。

【讨论】:

    【解决方案2】:

    唯一的原因,为什么不管你的输入如何,指定对齐方式没有任何惩罚/好处是,无论你输入什么,你都会得到机器对齐的内存。所以在支持AVX的处理器上,你是无论您的输入如何,总是获得 32 字节对齐的内存。

    您还将看到,无论您使用什么对齐值,mkl_malloc 返回的内存地址都是可整除的 32 对齐的。或者,您可以测试像 _mm256_load_pd 这样的低级内部函数,当使用非 32 字节对齐的地址时,它会出现段错误,从不出现段错误。

    一些小细节:当你分配一块内存时,OSX 总是给你 32 字节的地址,独立于堆/堆栈,而当你在堆上分配时,Linux 总是给你对齐的内存。堆栈在 Linux 上是一个运气问题,但是小矩阵大小已经超过了堆栈分配的限制。我不了解 Windows 上的内存分配。

    我注意到后者,当我为 numerics library 编写测试时,我使用 std::vector<typename T, alignment A> 进行内存分配,较小的矩阵测试有时会在 Linux 上出现段错误。

    TLDR:您的对齐输入被有效地丢弃,无论如何您都在获得机器对齐。

    【讨论】:

      【解决方案3】:

      我认为对齐没有“最佳”价值。根据您的架构,对齐通常是硬件强制执行的属性,主要是出于优化原因。

      谈到您的具体问题,重要的是要说明您分配内存的确切目的是什么?哪一块硬件访问内存?例如,我使用 DMA 引擎,它要求源地址与每个事务传输大小对齐(其中 xfer 大小 = 4、8、16、32、128)。我还使用了向量寄存器,其中有一个 128 位对齐的负载是明智的。

      总结一下:视情况而定。

      【讨论】:

        猜你喜欢
        • 2013-06-02
        • 2011-09-22
        • 2010-11-30
        • 2019-08-29
        • 2019-10-04
        • 2012-04-17
        • 2011-04-25
        • 1970-01-01
        • 2020-01-14
        相关资源
        最近更新 更多