CPU中的乱序执行意味着CPU可以重新排序指令以获得更好的性能,这意味着CPU必须做一些非常漂亮的簿记等。还有其他处理器方法,例如超线程。
一些花哨的编译器在有限的程度上理解指令的(非)相关性,并且将自动交错指令流(可能在比CPU看到的更长的窗口上)以更好地利用处理器。浮动和整数指令的有意编译时交织是另一个例子。
现在我有高度并行的任务。我通常拥有老化的单核x86处理器,没有超线程。
是否有一种直接的方法来让我的'for'循环的主体为这个高度并行的任务交错,以便两个(或更多)迭代一起完成?(这与我理解的'循环展开'略有不同。)
我的任务是运行一系列指令的“虚拟机”,我将真正简化为例:
void run(int num){
for(int n = 0; n <num; n ++){
vm_t data(n);
for(int i = 0; i <data.len(); i ++){
data.insn(ⅰ).parse();
data.insn(ⅰ).eval();
}
}
}
因此执行跟踪可能如下所示:
data(1)insn(0)解析
数据(1)insn(0)eval
数据(1)insn(1)解析
...
数据(2)insn(1)eval
数据(2)insn(2)解析
数据(2)insn(2)eval
现在,我想要的是能够并行显式地进行两次(或更多次)迭代:
data(1)insn(0)解析
数据(2)insn(0)解析\处理器可以做这两个流入的OOO
数据(1)insn(0)eval /
数据(2)insn(0)eval \ OOO机会也在这里
数据(1)insn(1)解析/
数据(2)insn(1)解析
我知道,从分析中,(例如使用带有--simulate-cache = yes的Callgrind),解析是关于随机存储器访问(缓存缺失),而eval是关于在寄存器中执行操作然后再写回结果。每一步都是几千条指令。因此,如果我可以将这两个步骤同时进行两次迭代混合,那么处理器将有希望在解析步骤的缓存未命中时执行某些操作...
是否有一些c ++模板疯狂才能产生这种显式并行性?
当然,我可以在代码中进行交错 - 甚至是交错 - 但它会使代码的可读性降低。如果我真的想要不可读,我可以做汇编程序!但这种事情肯定有一些模式吗?
发布于 2019-03-26 08:54:19
鉴于优化编译器和流水线处理器,我建议您只编写清晰易读的代码。
发布于 2019-03-26 09:13:04
您最好的计划可能是研究OpenMP。它基本上允许您在代码中插入“pragma”,告诉编译器如何在处理器之间进行分割。
https://stackoverflow.com/questions/-100001040
复制相似问题