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) 用于计算最大值。

                     

© 小时科技 保留一切权利