Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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++ 使用OpenMP线程重新初始化向量是否更快?_C++_Multithreading_Openmp - Fatal编程技术网

C++ 使用OpenMP线程重新初始化向量是否更快?

C++ 使用OpenMP线程重新初始化向量是否更快?,c++,multithreading,openmp,C++,Multithreading,Openmp,我正在使用OpenMP库进行并行计算。我使用C++向量,其大小通常为1×10 ^ 5的顺序。在进行迭代过程中,我需要将这些大向量(不是线程私有的,而是全局范围)重新初始化为初始值。使用#pragma-omp-for或#pragma-omp-single哪种方法更快 >一般的答案需要“取决于,你必须测量”,因为C++中的初始化可以根据类型、琐碎或非常昂贵而定。您没有提供太多的细节,因此只能猜测一点。 如果一个类有一个非常昂贵的构造函数,那么并行化工作可能非常值得 您的特定措辞“初始化为值”表明您的

我正在使用OpenMP库进行并行计算。我使用C++向量,其大小通常为1×10 ^ 5的顺序。在进行迭代过程中,我需要将这些大向量(不是线程私有的,而是全局范围)重新初始化为初始值。使用#pragma-omp-for或#pragma-omp-single哪种方法更快

>一般的答案需要“取决于,你必须测量”,因为C++中的初始化可以根据类型、琐碎或非常昂贵而定。您没有提供太多的细节,因此只能猜测一点。
如果一个类有一个非常昂贵的构造函数,那么并行化工作可能非常值得

您的特定措辞“初始化为值”表明您的向量包含POD(例如,整数?)。我假设情况就是这样

假设这样,并行化几乎肯定不会更快。此操作受内存带宽的限制,一个CPU线程应该能够将内存带宽饱和到大约99%


然而,并行化可能会很慢,这是由于几个原因(我不打算详细说明,可以说它不太可能更快)。

假设对基本数据类型进行简单初始化,初始化本身将受到内存或缓存带宽的限制。然而,在现代系统上,您必须使用多个线程来充分利用内存和缓存带宽。例如,看一看,前两行比较并行与单线程缓存,最后两行比较并行与单线程主内存带宽。在面向高性能的系统上,特别是在具有多个套接字的系统上,更多的线程对于利用可用带宽非常重要

但是,重新初始化的性能并不是您应该关心的唯一问题。例如,假设双精度浮点数,10e5个元素等于800KB内存,可以放入缓存。为了提高整体性能,您应该尝试确保在初始化之后,数据位于靠近稍后访问数据的核心的缓存中。在NUMA系统中(多个插槽可以更快地访问其本地内存),这一点更为重要

如果您同时初始化共享内存,请确保不要从不同的内核写入相同的缓存线,并尝试保持访问模式的规则性,以避免混淆预取器和CPU的其他巧妙魔力

一般建议是:从一个简单的实现开始,然后分析您的应用程序,以了解瓶颈实际在哪里。不要投资于复杂的、难以维护的、特定于系统的优化,这些优化可能只会影响整个运行时代码的一小部分。如果这是应用程序的瓶颈,并且硬件资源没有得到很好的利用,那么您需要了解底层硬件(本地/共享缓存、NUMA、预取器)的性能特征并相应地调整代码。

一个CPU线程应该能够将内存带宽饱和到大约99%。这是错误的。例如,见。