改进多线程的一般提示(在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
线程运行的给定代码与单个线程相比要快多少?
-有没有提高多线程进程性能的一般技巧?我相信您知道障碍的代价等显而易见的问题。但很难在琐碎的东西和对某人有帮助的东西之间划清界限。以下是从使用中学到的一些经验教训,如果我想得更多,我将补充它们:
- 首选长代码段和长并行段的并行运行(
),而不是单独并行循环(#pragma omp parallel…#pragma omp for
)#pragma omp parallel for
- 不要将短循环并行化。在二维迭代中,它通常足以并行化外部循环。如果您使用
将整个过程并行化,请注意OpenMP将线性化,引入融合变量并单独访问索引会产生开销collapse
- 使用线程私有堆。尽可能避免共享池和集合,即使集合的不同成员将由不同的线程独立访问
- 分析您的代码,并查看在繁忙等待上花费了多少时间,以及可能发生的情况
- 了解使用不同计划策略的后果。试试更好的,不要妄想
- 如果使用关键部分,请命名它们。所有未命名的CSs都必须互相等待
- 如果您的代码使用随机数,请使其可复制:定义线程本地RNG,以可控的方式为所有内容设置种子,对减少设置顺序。确定基准,而不是统计基准
- 浏览有关堆栈溢出的类似问题,例如精彩答案
- 首选长代码段和长并行段的并行运行(
),而不是单独并行循环(#pragma omp parallel…#pragma omp for
)#pragma omp parallel for
- 不要将短循环并行化。在二维迭代中,它通常足以并行化外部循环。如果您使用
将整个过程并行化,请注意OpenMP将线性化,引入融合变量并单独访问索引会产生开销collapse
- 使用线程私有堆。尽可能避免共享池和集合,即使集合的不同成员将由不同的线程独立访问
- 分析您的代码,并查看在繁忙等待上花费了多少时间,以及可能发生的情况
- 了解使用不同计划策略的后果。试试更好的,不要妄想
- 如果使用关键部分,请命名它们。所有未命名的CSs都必须互相等待
- 如果您的代码使用随机数,请使其可复制:定义线程本地RNG,以可控的方式为所有内容设置种子,对减少设置顺序。确定基准,而不是统计基准
- 浏览有关堆栈溢出的类似问题,例如精彩答案
real 1m22.572s
user 28m28.206s
sys 0m4.170s