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