我应该与mkl_malloc对齐的值是多少?

我应该与mkl_malloc对齐的值是多少?,c,linear-algebra,memory-alignment,blas,intel-mkl,C,Linear Algebra,Memory Alignment,Blas,Intel Mkl,函数mkl_malloc类似于malloc,但有一个额外的对齐参数。以下是原型: void* mkl_malloc (size_t alloc_size, int alignment); 我注意到,alignment的不同值具有不同的性能。除了尝试和错误之外,是否有一种规范的或记录在案的方法来确定对齐的最佳值?i、 e.正在使用的处理器、正在调用的函数、正在执行的操作等 这个问题广泛适用于任何使用MKL的人,所以我很惊讶参考手册中没有这个问题 更新:我尝试过使用mkl\u sparse\u s

函数
mkl_malloc
类似于
malloc
,但有一个额外的
对齐
参数。以下是原型:

void* mkl_malloc (size_t alloc_size, int alignment);
我注意到,
alignment
的不同值具有不同的性能。除了尝试和错误之外,是否有一种规范的或记录在案的方法来确定
对齐的最佳值
?i、 e.正在使用的处理器、正在调用的函数、正在执行的操作等

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


更新:我尝试过使用
mkl\u sparse\u spmm
,但没有注意到将对齐设置为2到1024字节的幂次的性能有显著差异,之后性能会下降。我使用的是Intel Xeon E5-2683。

唯一的原因是,无论您的输入如何,指定对齐都不会带来任何损失/收益,因为无论您键入什么,都会获得机器对齐的内存。因此,在支持AVX的处理器上,无论您的输入是什么,您总是可以获得32字节对齐的内存

您还将看到,无论您选择什么对齐值,
mkl_malloc
返回的内存地址都是可整除的32对齐的。或者,您可以测试像
\u mm256\u load\u pd
这样的低电平INTRISIC,当使用非32字节对齐的地址时,它将出现seg故障

一些小细节:当您分配一块内存时,OSX总是给您32字节的地址,与堆/堆栈无关;而当您在堆上分配内存时,Linux总是给您对齐的内存。在Linux上,堆栈是一个运气问题,但如果矩阵的大小很小,则已经超出了堆栈分配的限制。我不了解Windows上的内存分配

我注意到了后者,当我为我的系统编写测试时,我使用
std::vector
进行内存分配,而较小的矩阵测试在Linux上有时会出现seg故障


TLDR:您的校准输入被有效地丢弃,并且不管怎样,您都将获得机器校准

对齐仅在可以使用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中向量寄存器的大小对齐,以便可以使用相关的扩展。使用带有校准参数的
mkl_malloc
可确保校准至少达到该值,但可以更高。应该使用它来确保数据按照您想要的方式对齐,但是绝对没有理由将数据对齐到1MB。

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

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


总而言之:这要视情况而定。

以上问题的答案有帮助吗?谢谢,但不是。我想知道对于给定的操作和硬件,对齐的价值是什么,它能给我带来最好的性能。直觉上,对齐应该与处理器的字大小相匹配。你看到了什么结果?谢谢!我发现2到1024的幂次给出了非常相似的性能。。。但我一直在尝试内存访问受限的稀疏操作。我将再次尝试密集操作。通常,您可以使用
\u Alignof(max\u align\u t)
。但是,这实际上取决于数据的类型。在当前x86-64上,
\u Alignof(max\u align\u t)==16
,但AVX512矢量需要
64
,AVX2矢量需要
32