我写了一些高度优化的代码,这里是一两件事,已窃听我相当长一段时间,我有一个三重for循环一样研究员:在x86指令中写入非阻塞存储器?
for(int ii = 0; ii < ny; ii++){
for(int jj = 0; jj < nx; jj++){
....some serious calculation....
for(int kk = 0; kk < CONSTANT; kk++){
_mm_storeu_ps(&((cells.dir[kk])[ii * nx +jj],result); // Writing result to correct location
}
}
}
细胞只是一个9个指针结构,每个指向一个大尺寸的阵列。该代码最初是以struct(AoS)模式的数组编写的,我手动重写了整个事物以使用数组的结构,因此我可以使用SSE加速它。但由于代码的原始结构,上面的代码必须以缓存不友好的方式将结果写入正确的位置,如果我评论这一行,我整个程序的运行时间可能会减少超过40% 。我只是想知道是否有任何可用于x86的非阻塞式内存写入指令,我可以利用它?或者我可以使用这种内存写入其他一些技巧?请不要建议改变循环的结构,这太耗费时间了。
感谢, 鲍勃
几乎所有现代非嵌入式处理器的写入都是非阻塞的。他们只是被推到队列中,并在后台完成。也就是说,在队列阻塞之前,队列的大小是有限制的。也就是说,也要注意你如何使用缓存线。 – Mysticial
@Mysticial我刚刚发现它更可能是因为''_mm_storeu_ps''非常昂贵,而不是缓存未命中,这会减慢我的程序。你有什么建议吗? – dorafmon
@dorafmon:你需要将结果放在那些确切的存储位置,或者你打算在以后读回来进行更多的计算?您可以通过将缓存更容易地写入临时缓冲区来提高性能。过去我已经做到了这一点,取得了一些成功。但是,如果这些商店的最终结果需要按照输出数组中的特定顺序进行,那么您可能只是运气不好。 –