当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《c++中的显式代码并行性》经验,为你挑选了1个好方法。

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..:

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

推荐阅读
我我檬檬我我186
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有