c ++中的显式代码并行性

Wil*_*ill 3 c++ performance design-patterns

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(i).parse();
        data.insn(i).eval();
     }
  }  
}

因此执行跟踪可能如下所示:

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 ++模板疯狂才能产生这种显式并行性?

当然,我可以在代码中进行交错 - 甚至是交错 - 但它会使代码的可读性降低.如果我真的想要不可读,我可以做汇编程序!但这种事情肯定有一些模式吗?

tzo*_*zot 5

鉴于优化编译器和流水线处理器,我建议您只编写清晰易读的代码.