改进多线程的一般提示(在C+;+;) 我已经建立了一个C++代码,没有想到以后我需要多线程。我现在已经使用openMP对3个主要for循环进行了多线程处理。以下是性能比较(通过bash的时间测量)

改进多线程的一般提示(在C+;+;) 我已经建立了一个C++代码,没有想到以后我需要多线程。我现在已经使用openMP对3个主要for循环进行了多线程处理。以下是性能比较(通过bash的时间测量),c++,multithreading,performance,prediction,C++,Multithreading,Performance,Prediction,单线 real 5m50.008s user 5m49.072s sys 0m0.877s 多线程(24线程) 24核的使用将实时性降低了4.24倍。当然,我没想到代码会快24倍。我真的不知道该期待什么 -是否有一条经验法则允许我们预测使用n线程运行的给定代码与单个线程相比要快多少? -有没有提高多线程进程性能的一般技巧?我相信您知道障碍的代价等显而易见的问题。但很难在琐碎的东西和对某人有帮助的东西之间划清界限。以下是从使用中学到的一些经验教训,如果我想得更多,我将补充它们

单线

real    5m50.008s
user    5m49.072s
sys     0m0.877s
多线程(24线程)

24核的使用将实时性降低了4.24倍。当然,我没想到代码会快24倍。我真的不知道该期待什么

-是否有一条经验法则允许我们预测使用
n
线程运行的给定代码与单个线程相比要快多少?


-有没有提高多线程进程性能的一般技巧?

我相信您知道障碍的代价等显而易见的问题。但很难在琐碎的东西和对某人有帮助的东西之间划清界限。以下是从使用中学到的一些经验教训,如果我想得更多,我将补充它们:

    >p>总是尽量使用线程私有变量,即使减少,只提供少量的集体结果。

  • 首选长代码段和长并行段的并行运行(
    #pragma omp parallel…#pragma omp for
    ),而不是单独并行循环(
    #pragma omp parallel for

  • 不要将短循环并行化。在二维迭代中,它通常足以并行化外部循环。如果您使用
    collapse
    将整个过程并行化,请注意OpenMP将线性化,引入融合变量并单独访问索引会产生开销

  • 使用线程私有堆。尽可能避免共享池和集合,即使集合的不同成员将由不同的线程独立访问

  • 分析您的代码,并查看在繁忙等待上花费了多少时间,以及可能发生的情况

  • 了解使用不同计划策略的后果。试试更好的,不要妄想

  • 如果使用关键部分,请命名它们。所有未命名的CSs都必须互相等待

  • 如果您的代码使用随机数,请使其可复制:定义线程本地RNG,以可控的方式为所有内容设置种子,对减少设置顺序。确定基准,而不是统计基准

  • 浏览有关堆栈溢出的类似问题,例如精彩答案


我相信你知道显而易见的障碍成本。但很难在琐碎的东西和对某人有帮助的东西之间划清界限。以下是从使用中学到的一些经验教训,如果我想得更多,我将补充它们:

    >p>总是尽量使用线程私有变量,即使减少,只提供少量的集体结果。

  • 首选长代码段和长并行段的并行运行(
    #pragma omp parallel…#pragma omp for
    ),而不是单独并行循环(
    #pragma omp parallel for

  • 不要将短循环并行化。在二维迭代中,它通常足以并行化外部循环。如果您使用
    collapse
    将整个过程并行化,请注意OpenMP将线性化,引入融合变量并单独访问索引会产生开销

  • 使用线程私有堆。尽可能避免共享池和集合,即使集合的不同成员将由不同的线程独立访问

  • 分析您的代码,并查看在繁忙等待上花费了多少时间,以及可能发生的情况

  • 了解使用不同计划策略的后果。试试更好的,不要妄想

  • 如果使用关键部分,请命名它们。所有未命名的CSs都必须互相等待

  • 如果您的代码使用随机数,请使其可复制:定义线程本地RNG,以可控的方式为所有内容设置种子,对减少设置顺序。确定基准,而不是统计基准

  • 浏览有关堆栈溢出的类似问题,例如精彩答案


u是否有一台具有24核的机器?@pm100是(24个逻辑核)。我不拥有它,它属于我的实验室。你有一台24核的机器吗?@pm100是的(24个逻辑核)。它不是我的,它属于我的实验室。
real    1m22.572s
user    28m28.206s
sys     0m4.170s