gpt4 book ai didi

multithreading - 并行但速度较慢

转载 作者:行者123 更新时间:2023-12-04 16:23:55 24 4
gpt4 key购买 nike

我正在使用蒙特卡罗方法来计算 pi 并进行并行编程和 openmp 的基本经验

问题是当我使用 1 个线程 x 次迭代时,总是比 n 个线程 x 次迭代运行得更快。谁能告诉我为什么?

例如,代码像这样运行“a.out 1 1000000”,其中 1 是线程,1000000 是迭代

include <omp.h>
include <stdio.h>
include <stdlib.h>
include <iostream>
include <iomanip>
include <math.h>

using namespace std;

int main (int argc, char *argv[]) {

double arrow_area_circle, pi;
float xp, yp;
int i, n;
double pitg= atan(1.0)*4.0; //for pi error
cout << "Number processors: " << omp_get_num_procs() << endl;

//Number of divisions
iterarions=atoi(argv[2]);
arrow_area_circle = 0.0;

#pragma omp parallel num_threads(atoi(argv[1]))
{
srandom(omp_get_thread_num());

#pragma omp for private(xp, yp) reduction(+:arrow_area_circle) //*,/,-,+
for (i = 0; i < iterarions; i++) {
xp=rand()/(float)RAND_MAX;
yp=rand()/(float)RAND_MAX;

if(pow(xp,2.0)+pow(yp,2.0)<=1) arrow_area_circle++;
}
}

pi = 4*arrow_area_circle / iterarions;
cout << setprecision(18) << "PI = " << pi << endl << endl;
cout << setprecision(18) << "Erro = " << pitg-pi << endl << endl;

return 0;
}

最佳答案

如果您在比系统中的 CPU 数量更多的线程中完成工作,那么像这样的 CPU 密集型任务会变慢。如果您在单 CPU 系统上运行它,您肯定会看到多个线程的速度变慢。这是因为操作系统必须在各种线程之间切换——这纯粹是开销。理想情况下,对于这样的任务,您应该拥有与内核相同数量的线程。

另一个问题是 arrow_area_circle 在线程之间共享。如果每个内核上都有一个线程在运行,那么增加 arrow_area_circle 将使其他内核缓存中的副本无效,导致它们必须重新获取。应该需要几个周期的 arrow_area_circle++ 将需要几十个或数百个周期。尝试为每个线程创建一个 arrow_area_circle 并在最后将它们组合起来。

编辑:Joe Duffy 刚刚发布了一个 blog entry关于在线程之间共享数据的成本。

关于multithreading - 并行但速度较慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1591977/

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