OpenMP 笔记(C 语言)

                     

贡献者: addis

  • 本文处于草稿阶段。
预备知识 C++ 基础

   当并行时一个或多个命令不是 thread safe 的时候,可以把它放在 critical block 里面,这里面一次只有一个 thread 能进入。

#pragma omp parallel for
for(int i = 0; i < size; i++) {
	myArray[i] = i * 2;
	#pragma omp critical
	{
		std::cout << "Processing value: " << myArray[i]
			<< " by thread " << omp_get_thread_num() << std::endl;
	}
	// ...
}

   一个更高性能的命令是

#pragma omp atomic
counter++;

   若想把每个线程中的一个数加到一起,除了 atomic 也有现成的办法(reduction):

// sum a 2d array
#pragma omp parallel for reduction(+:s2)
for (Long j = 0; j < a.n1(); ++j) {
	const double *p = &a(0, j);
	double s = 0;
	for (Long i = 0; i < Nr; ++i)
		s += p[i];
	s2 += s;
}
这种把每个线程中的数据累计到一个数中的过程就叫做 reduction,其他并行计算框架也使用这个词。类似的,还有 reduction(max:my_var) 用于计算最大值。


致读者: 小时百科一直以来坚持所有内容免费无广告,这导致我们处于严重的亏损状态。 长此以往很可能会最终导致我们不得不选择大量广告以及内容付费等。 因此,我们请求广大读者热心打赏 ,使网站得以健康发展。 如果看到这条信息的每位读者能慷慨打赏 20 元,我们一周就能脱离亏损, 并在接下来的一年里向所有读者继续免费提供优质内容。 但遗憾的是只有不到 1% 的读者愿意捐款, 他们的付出帮助了 99% 的读者免费获取知识, 我们在此表示感谢。

                     

友情链接: 超理论坛 | ©小时科技 保留一切权利