avg*_*vgn 4 c linear-algebra memory-alignment blas intel-mkl
该函数mkl_malloc类似于malloc但有一个额外的alignment参数。这是原型:
void* mkl_malloc (size_t alloc_size, int alignment);
Run Code Online (Sandbox Code Playgroud)
我注意到具有不同值的不同性能alignment。除了反复试验之外,是否有一种规范的或记录在案的有条理的方法来决定 的最佳值alignment?即正在使用的处理器、正在调用的函数、正在执行的操作等。
这个问题广泛适用于任何使用 MKL 的人,所以我很惊讶它不在参考手册中。
更新:我已经尝试过mkl_sparse_spmm并且没有注意到将对齐设置为 2 的幂(最多 1024 字节)的性能有显着差异,之后性能往往会下降。我使用的是英特尔至强 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 中向量寄存器的大小对齐,以便您可以使用相关扩展。mkl_malloc与一些对齐参数一起使用可保证至少与该值对齐,但它可以更多。它应该用于确保数据按照您想要的方式对齐,但绝对没有理由对齐到 1MB。
| 归档时间: |
|
| 查看次数: |
935 次 |
| 最近记录: |