我已经知道SIMD指令集包含SSE1到SSE5
但是没有发现太多关于任何指令集支持MIMD arch的讨论
在c ++代码中,我们可以使用intrinsic来编写“SIMD运行”代码
有没有办法写“MIMD运行”代码?
如果MIMD比SIMD更强大,
编写c ++代码支持MIMD会更好
我的想法是否正确?
答案 0 :(得分:4)
维基百科页面Flynn's taxonomy将MIMD描述为:
多个自治处理器同时对不同数据执行不同的指令。 MIMD架构包括多核超标量处理器和分布式系统,使用一个共享内存空间或分布式内存空间。
每次划分算法(例如使用OpenMP进入线程)时,您可能正在使用MIMD。通常,您不需要特殊的“MIMD指令集” - ISA与SISD相同,因为每个指令流在其自己的数据上独立于其他指令流运行。 EPIC(显式并行指令计算)是一种替代方法,其中功能单元以锁步方式运行,但具有独立(ish)指令和数据。
至于哪个“更强大”(或更高能效,或最低延迟,或者您的用例中的任何问题),没有一个单一的答案。与许多复杂问题一样,“它取决于”。
答案 1 :(得分:2)
我的想法是否正确?
这当然是天真的,具体实施。请记住以下事实:
Tycho生成非常聪明的代码(当您进行optimizing compilers优化时)。例如,尝试将一些最近的enable调用为g++ -march=native -O3 -Wall
(如果要查看生成的汇编代码,也可以-fverbose-asm -S
);参见CppCon 2017:Matt Godbolt' GCC “我的编译器最近为我做了什么?解开编译器的盖子“
考虑显式并行化方法:多线程(阅读一些OpenACC教程),pthread programming ...
另请参阅CUDA相关问题。
如果MIMD比SIMD更强大,最好编写c ++代码支持MIMD。
当然,并非总是如此,如果你只关心表现。像往常一样,这取决于你需要进行基准测试。