c++ - 用于加速汇总循环的多线程 C++ 程序

标签 c++ multithreading performance algorithm

我有一个从 1 迭代到 N 的循环,并随着时间的推移进行模块化求和。但是 N 非常大,所以我想知道是否有一种方法可以利用多线程来修改它。

给出示例程序

for (long long i = 1; i < N; ++i)
   total = (total + f(i)) % modulus;

f(i) 在我的例子中不是一个实际的函数,而是一个会占用空间的长表达式。把它放在那里是为了说明目的。

最佳答案

是的,试试这个:

double total=0;
#pragma omp parallel for reduction(+:total)
for (long long i = 1; i < N; ++i)
  total = (total + f(i)) % modulus;

编译:

g++ -fopenmp your_program.c

就这么简单!不需要 header 。 #pragma 行自动启动几个线程,平均划分循环的迭代,然后在循环后重新组合所有内容。但请注意,您必须事先知道迭代次数。

此代码使用 OpenMP ,它提供了非常适合您的情况的易于使用的并行性。 OpenMP 甚至内置于 GCC 和 MSVC compilers .

This page显示了其他一些可能的归约操作。

如果你需要嵌套for循环,你可以这样写

double total=0;
#pragma omp parallel for reduction(+:total)
for (long long i = 1; i < N; ++i)
for (long long j = 1; j < N; ++j)
  total = (total + f(i)*j) % modulus;

并且外循环将被并行化,每个线程运行其自己的内循环拷贝。

但您也可以使用 collapse指令:

#pragma omp parallel for reduction(+:total) collapse(2)

然后两个循环的迭代将自动分开。

如果每个线程都需要自己的循环之前定义的变量拷贝,请使用 private 命令:

double total=0, cheese=4;
#pragma omp parallel for reduction(+:total) private(cheese)
for (long long i = 1; i < N; ++i)
  total = (total + f(i)) % modulus;

请注意,您不需要使用 private(total),因为 reduction 暗示了这一点。

关于c++ - 用于加速汇总循环的多线程 C++ 程序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17112999/

相关文章:

Java的ExecutorService性能

java - 为什么 if (variable1 % variable2 == 0) 效率低下?

c - 优化嵌套循环的 C 代码

c++ - 使用 FFMPEG API 读取特定视频帧

c++ - 在函数模板中的类型之间转换

c++ - 每秒仅运行 60 次代码

c# - 运行多个线程,在另一个线程完成时启动新线程

c++ - 如何实现动态线程Boost::Barrier?

MySQL:存储长笔记的最有效数据类型?

c++ - 如何在 C++ 中编写内联相互抽象代码?