gpt4 book ai didi

c++ - 使用 OpenMP 线程重新初始化 vector 是否更快?

转载 作者:行者123 更新时间:2023-11-30 05:28:28 28 4
gpt4 key购买 nike

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

最佳答案

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

然而,重新初始化的性能并不是您唯一应该关心的事情。假设例如 double float ,10e5 个元素等于 800 kb 内存,适合缓存。为了提高整体性能,您应该尝试确保初始化后数据位于靠近稍后访问数据的核心的缓存中。在 NUMA 系统中(多个套接字对其本地内存的内存访问速度更快),这一点更为重要。

如果您同时初始化共享内存,请确保不要从不同的内核写入相同的缓存行,并尽量保持访问模式的规律性,以免混淆预取器和 CPU 的其他聪明的魔法 .

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

关于c++ - 使用 OpenMP 线程重新初始化 vector 是否更快?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36821618/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com