小白的OpenMP学习总结

1、进程与线程

  • 到看书之前,一直都不清楚进程和线程的异同,上操作系统实验时遇到fork函数,不知道应该说子进程还是子线程。
  • 后才知道,几个或一个线程被同一个进程派生(fork),每个线程有自己的栈和程序计数器。当一个线程完成了执行,就又合并(join)到启动它的进程中。

 

2、缺省作用域

  我觉得是没有显式写出的变量的作用域吧。如OpenMP中有一个句子default(none),如果在pragma句子后面添加这句,就被要求明确写出所有变量的作用域。例如

#pragma omp parallel for num_threads(10) \
	default(none) reduction(+:sum) private(k, factor) \
	shared(n)

3、第一个OpenMP程序-曲边梯形面积

  •   题面如下:

  

          

  • 代码

  

#include <stdio.h>
#include <stdlib.h>
#include <omp.h>

double f(double x);

int main(){
        double a=0, b=100, h, approx;
        int n=1e9;
        int i;
        
        //int thread_count;
        //thread_count = strtol(argv[1], NULL, 10);   // 读入线程数
        //printf("Enter a, b, and n\n");
        //scanf("%lf %lf %d", &a, &b, &n);

        h=(b-a)*1.0/n;
        approx=(f(a)+f(b))/2.0;
        #pragma omp parallel for num_threads(24) reduction(+: approx)
        for (i=1; i<n; i++)
                approx += f(a+i*h);

        approx*=h;
        printf("approx=%.7f\n",  approx);

        return 0;
}
        

  

  •  一些问题(solved & solving):

    1)每个线程都会进入for循环,那,是会运行(线程数*n-1)遍for吗?

      

       调度方案默认为static。例如:

       

#       pragma omp parallel for num_threads(24)
        for (i=0; i<12; i++){
                printf("hello, my id is ->  %d\n", omp_get_thread_num());
        }

         它的运行如下:

// 开四个线程
for (k: 0-3){ ... } for (k: 3-6){ ... } for (k: 6-9){ ... } for (k: 9-12){ ... }

  

    2)这段代码的私有变量和公有变量

    3)程序总的运行流程如何

    4)私有变量、公有变量共用memory的具体细节

    5)openmp是数据并行还是任务并行

 

 

待更......

 #pragma omp parallel for num_threads(24) reduction(+:sum) privte(factor)

转载于:https://www.cnblogs.com/yy222/p/9978932.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值