首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >c ++中的显式代码并行性

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

Stack Overflow用户
提问于 2019-03-26 00:03:51
回答 2查看 0关注 0票数 0

CPU中的乱序执行意味着CPU可以重新排序指令以获得更好的性能,这意味着CPU必须做一些非常漂亮的簿记等。还有其他处理器方法,例如超线程。

一些花哨的编译器在有限的程度上理解指令的(非)相关性,并且将自动交错指令流(可能在比CPU看到的更长的窗口上)以更好地利用处理器。浮动和整数指令的有意编译时交织是另一个例子。

现在我有高度并行的任务。我通常拥有老化的单核x86处理器,没有超线程。

是否有一种直接的方法来让我的'for'循环的主体为这个高度并行的任务交错,以便两个(或更多)迭代一起完成?(这与我理解的'循环展开'略有不同。)

我的任务是运行一系列指令的“虚拟机”,我将真正简化为例:

代码语言:javascript
运行
复制
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();
     }
  }  
}

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

代码语言:javascript
运行
复制
data(1)insn(0)解析
数据(1)insn(0)eval
数据(1)insn(1)解析
...
数据(2)insn(1)eval
数据(2)insn(2)解析
数据(2)insn(2)eval

现在,我想要的是能够并行显式地进行两次(或更多次)迭代:

代码语言:javascript
运行
复制
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 ++模板疯狂才能产生这种显式并行性?

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

EN

回答 2

Stack Overflow用户

发布于 2019-03-26 08:54:19

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

票数 0
EN

Stack Overflow用户

发布于 2019-03-26 09:13:04

您最好的计划可能是研究OpenMP。它基本上允许您在代码中插入“pragma”,告诉编译器如何在处理器之间进行分割。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/-100001040

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档