|
本帖最后由 guojiasheng 于 2015-12-7 15:58 编辑
正好使用openmp,对师兄这边做个补充哈~
gcc 版本4.2以上支持openMP,实验的环境是在linux下的gcc-4.8.2编译,12核。
编译:/opt/compiler/gcc-4.8.2/bin/g++ main.c -fopenmp (记得需要加个-fopenmp)
- /**
- * @file main.c
- * @author guojiasheng
- * @date 2015/12/04 19:27:51
- * @brief
- *
- **/
- #include <iostream>
- #include <omp.h>
- #include <stdio.h>
- using namespace std;
- //同步标识
- void critical()
- {
- int sum=0;
- #pragma omp parallel
- {
- #pragma omp for
- for (int i =0 ;i<10 ; i++)
- {
- #pragma omp critical
- sum += 1;
- }
- }
- cout << "sum: " << sum << endl;
- }
- //并行
- void parallel()
- {
- #pragma omp parallel
- {
- cout << "thread: " << omp_get_thread_num() << endl;
- }
- }
- //并行for
- void parallelFor()
- {
- //设置并行核数
- omp_set_num_threads(4);
- #pragma omp parallel for
- for (int i=0; i<10 ;i++)
- printf("thread%d,value:%d\n",omp_get_thread_num(),i);
- }
- int main(){
-
- critical();
- parallel();
- parallelFor();
- }
- /* vim: set expandtab ts=4 sw=4 sts=4 tw=100: */
复制代码
结果说明:
(1)parallel();
(2)parallelFor();
使用prarallel的话,每个线程都有执行一个printf
使用prarallel for引导的话,for会自动切分成给线程,可以看出来,线程0输出了0,1,2
(3)critical();
因为sum是共享变量,所以如果多线程不加以锁控制的话,结果会和预期的不一样,openMP内置一个标志,可以保证只有一个线程读取sum,当然这个会使得效率变低。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|