Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/wix/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ SIMD与面向对象编程_C++_Oop_Cpu_Sse_Simd - Fatal编程技术网

C++ SIMD与面向对象编程

C++ SIMD与面向对象编程,c++,oop,cpu,sse,simd,C++,Oop,Cpu,Sse,Simd,我已经读了一段时间关于SIMD的书,我正在经历失眠症游戏的结束 我喜欢这个想法,我当然愿意让我的代码更高效地运行,但我只是不清楚如何从更高级别的代码设计开始使用SIMD 例如,假设我正在使用一种语言,它的低级足以让我知道数组或类的内存布局是什么,例如C++。 如果我现在有一个类,比如User,属性为User\u id或User\u name,作为一个对我所在领域建模的人,我知道我将能够将用户放入hashmaps中,或者放入数组、向量或集合中,所有这些都取决于给定用户需要的特定用例 也就是说,我有

我已经读了一段时间关于SIMD的书,我正在经历失眠症游戏的结束

我喜欢这个想法,我当然愿意让我的代码更高效地运行,但我只是不清楚如何从更高级别的代码设计开始使用SIMD

例如,假设我正在使用一种语言,它的低级足以让我知道数组或类的内存布局是什么,例如C++。 如果我现在有一个类,比如User,属性为User\u id或User\u name,作为一个对我所在领域建模的人,我知道我将能够将用户放入hashmaps中,或者放入数组、向量或集合中,所有这些都取决于给定用户需要的特定用例

也就是说,我有一个可重用的用户对象,这些对象所处的数据结构与用户类自身的内部结构无关

现在,所有的SIMD指南都说,而且我理解为什么,我应该使用数组的结构,而不是结构的数组

就SIMD指令而言,这是有道理的,但我无法找到一种方法来调和这一事实,即我不是从一个结构数组开始的,我可以很容易地将它转换为一个数组结构。相反,我从用户开始。有时用户(从对用户对象的引用的意义上讲)将位于数组中,有时位于哈希映射中,有时位于其他容器中

但这并不是在线指南提到的场景——他们都说要将AOS转变为SOA,我明白为什么,只是这不是我的出发点

我觉得有一个差距,我无法跨越,因为我找不到更复杂的例子。例如,也许我应该将与用户相关的数据保存在两个地方,一个是用于一般即席访问的用户对象,另一个是用于SIMD指令的SOA

  • 更一般地说,一个模型如何将更多面向对象的设计融入SIMD

  • 或者,在设计整个应用程序时考虑SIMD的人是否根本不遵守此类OO关注点,而是选择更面向数据的设计

  • 或者,SIMD仅限于代码库中的选定模块,需要时,OOP和SIMD之间的转换在运行时进行(即,实际数据保存在用户对象和SOA中,并且有手动代码保持同步)


如果有SIMD经验的人能够从更高的角度对其进行更多的了解,我将不胜感激。谢谢。

一个“用户”可能不会很好地使用SIMD。SIMD很棒,但它的应用仅限于对多个数据段重复相同的基本指令,这些数据段通常已经存储在一个数组中。用于数学运算;因此,我看不出用户将如何使用SIMD。通常,您只会在程序的热循环中使用显式SIMD(编译器将尝试自动向量化)。首先需要找到这个循环,然后看看是否可以应用SIMD。没有理由的显式SIMD可能是浪费时间。对于希望能够有效使用SIMD的数据,是的,您需要考虑如何存储该数据。(以及哪些操作可能对性能至关重要,以及它们需要哪些数据)。这将通知您何时为SIMD brute force优化数据布局的决定。(和非连续访问数据的顺序比AOS更接近缓存行),你仍然可以通过索引访问特定对象(并在数据结构中存储索引),而不是以C++作为对象的格式,它们可以让用户看到视图,它仅用于访问用户属性并表示用户。用户类将不拥有任何数据,实际上是用户容器中的引用。该容器可以在内部以SIMD友好的方式存储用户数据,并对用户执行矢量化操作。通过这种方式,您可以通过用户将OO风格的接口与其余代码保持一致,避免数据重复,并使用SIMD实现大规模操作。