我有一个从 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/