我正在尝试优化我的代码,利用多核处理器来复制任何操作大型密集阵列。
复制:我有一个大密集阵列(大约6000x100000),我需要从中拉出15x100000子阵列,在管道上进行多次计算。该管道由许多线性代数函数组成,这些函数由blas处理,这是多核的。与线性代数相比,提取数据的时间是否真的重要是一个悬而未决的问题,但我想谨慎一点,确保数据复制得到优化。
用于操作:我有许多不同的函数可以通过元素或行来操作数组。如果每个都是多核的话,那将是最好的。
我的问题是:最好是使用正确的框架(OpenML,OpenCL)并让编译器发生所有魔术,还是有更好的功能/库可以更快地完成这个?
答案 0 :(得分:7)
你的出发点应该是好的memcpy
。很长一段时间以来一直困扰着#34;复制表演的人的一些提示。
memcpy
效果,例如memcpy_bench
功能here。memcpy
多个核心上运行时multi_memcpy_bench
的可扩展性进行基准测试,例如rep movsd
here。 (除非您使用的是多插槽NUMA硬件,否则我认为您不会看到多线程复制带来多大好处。)movntps
上的日子早已不复存在;上次我看了gcc和英特尔编译器的CRT时,他们都改变了策略,具体取决于副本相对于CPU缓存大小的大小。但我的期望是,与任何linalg举重相比,你的副本将是相当小的开销。知道这些数字是多么好。我不希望OpenCL或任何 for CPU 在这里神奇地提供任何改进(除非你的系统的memcpy执行得不好);恕我直言,更详细地深入研究这些内容,深入了解在指令,寄存器,缓存行和页面层面实际发生的事情的基础知识,而不是远离它通过在顶层层叠另一层抽象。
当然,如果您正在考虑从当前使用的GPU加速线性代数版本的多核BLAS库中移植代码,这将成为一个完全不同(并且更加复杂)的问题(请参阅JayC& #39;以下评论)。如果你想要实质性的性能提升,你当然应该考虑它。