c - 我应该与 mkl_malloc 对齐什么值?

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

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

void* mkl_malloc (size_t alloc_size, int alignment);

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

这个问题广泛适用于任何使用 MKL 的人,所以我很惊讶它没有出现在引用手册中。

更新:我已经尝试使用 mkl_sparse_spmm 并且没有注意到将对齐设置为 2 的幂到 1024 字节在性能上的显着差异,之后性能趋于下降。我使用的是 Intel Xeon E5-2683。

最佳答案

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

一般来说,要根据CPU来选择对齐方式,如果支持256位寄存器的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 中 vector 寄存器的大小对齐,以便您可以使用相关的扩展。将 mkl_malloc 与一些对齐参数一起使用可以保证对齐到至少那个值,但是它可以更多。它应该用于确保数据按照您想要的方式对齐,但绝对没有充分的理由对齐到 1MB。

关于c - 我应该与 mkl_malloc 对齐什么值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51664030/

相关文章:

c - 在 OS X 上获取 CPU 时间

java - Apache Commons Math 中 RealVectors 的平方欧氏距离

python - 在 Python/NumPy 中计算矩阵的 Jordan 范式

python - 使用Power方法从Python中的3x3矩阵获取特征值

c++ - 为什么具有虚函数的类与没有虚函数的类对齐方式不同?

c++ - 内存寻址与数组的混淆

c - 如何使用 ffmpeg (C) 获取视频的 GOP 大小?

c - Variadic 函数没有正确传递第一个参数

c++ - alignas 说明符是否与 'new' 一起使用?

c - 访问未对齐的结构成员