并行计算之OpenMP入门简介_openmp 并行计算(1),2024年最新2024年Golang开发实战

并行计算之OpenMP入门简介_openmp 并行计算(1),2024年最新2024年Golang开发实战和传统的创建线程函数比起来 OpenMP 相当于为一个线程入口函数重复调用创建线程函数来创建线程并等待线程执行完

大家好,欢迎来到IT知识分享网。

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Golang全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上Go语言开发知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注go)
img

正文

{

int index= 0;
int time1 = 0;
int time2 = 0;
double value1 = 0.0, value2 = 0.0;
double result[2];

time1 = GetTickCount();
for(index = 1; index < MAX_VALUE; index ++)
value1 += 1.0 / index;

time1 = GetTickCount() – time1;
memset(result , 0, sizeof(double) * 2);
time2 = GetTickCount();

#pragma omp parallel for
for(index = 0; index < 2; index++)
result[index] = _test(index);

printf(“time1 = %d,time2 = %d\n”,time1,time2);
return;
}

int main()
{

OpenMPTest();

system(“pause”);
return 0;
}

在这里例子中用到了一个关键的语句:

#pragma omp parallel for

这个句子代表了C++中使用OpenMP的基本语法规则:#pragma omp 指令 [子句[子句]…]

1. OpenMP指令与库函数

OpenMP包括以下指令

  • parallel:用在一个代码段之前,表示这段代码将被多个线程并行执行
  • for:用于for循环之前,将循环分配到多个线程中并行执行,必须保证每次循环之间无相关性
  • parallel for:parallel 和 for语句的结合,也是用在一个for循环之前,表示for循环的代码将被多个线程并行执行
  • sections:用在可能会被并行执行的代码段之前
  • parallel sections:parallel和sections两个语句的结合
  • critical:用在一段代码临界区之前
  • single:用在一段只被单个线程执行的代码段之前,表示后面的代码段将被单线程执行
  • barrier:用于并行区内代码的线程同步,所有线程执行到barrier时要停止,直到所有线程都执行到barrier时才继续往下执行
  • atomic:用于指定一块内存区域被制动更新
  • master:用于指定一段代码块由主线程执行
  • ordered:用于指定并行区域的循环按顺序执行
  • threadprivate:用于指定一个变量是线程私有的

OpenMP除上述指令外,还有一些库函数,下面列出几个常用的库函数

  • omp_get_num_procs:返回运行本线程的多处理机的处理器个数
  • omp_get_num_threads:返回当前并行区域中的活动线程个数
  • omp_get_thread_num:返回线程号
  • omp_set_num_threads:设置并行执行代码时的线程个数
  • omp_init_lock:初始化一个简单锁
  • omp_set_lock:上锁操作
  • omp_unset_lock:解锁操作,要和omp_set_lock函数配对使用
  • omp_destroy_lock:omp_init_lock函数的配对操作函数,关闭一个锁

OpenMP还包括以下子句

  • private:指定每个线程都有它自己的变量私有副本
  • firstprivate:指定每个线程都有它自己的变量私有副本,并且变量要被继承主线程中的初值
  • lastprivate:主要是用来指定将线程中的私有变量的值在并行处理结束后复制回主线程中的对应变量
  • reduce:用来指定一个或多个变量是私有的,并且在并行处理结束后这些变量要执行指定的运算
  • nowait:忽略指定中暗含的等待
  • num_threads:指定线程的个数
  • schedule:指定如何调度for循环迭代
  • shared:指定一个或多个变量为多个线程间的共享变量
  • ordered:用来指定for循环的执行要按顺序执行
  • copyprivate:用于single指令中的指定变量为多个线程的共享变量
  • copyin:用来指定一个threadprivate的变量的值要用主线程的值进行初始化。
  • default:用来指定并行处理区域内的变量的使用方式,缺省是shared

2. parallel指令用法

parallel 是用来构造一个并行块的,也可以使用其他指令如for、sections等和它配合使用。其用法如下:

#pragma omp parallel [for | sections] [子句[子句]…]
{

// 需要并行执行的代码
}

例如,可以写一个简单的并行输出提示信息的代码:

#pragma omp parallel num_threads(8)
{

printf(“Hello, World!, ThreadId=%d\n”, omp_get_thread_num() );
}

在本机测试将会得到如下结果:

img

结果表明,printf函数被创建了8个线程来执行,并且每一个线程执行的先后次序并不确定。和传统的创建线程函数比起来,OpenMP相当于为一个线程入口函数重复调用创建线程函数来创建线程并等待线程执行完。如果在上面的代码中去掉num_threads(8)来指定线程数目,那么将根据实际CPU核心数目来创建线程数。

3. for指令用法

for指令则是用来将一个for循环分配到多个线程中执行。for指令一般可以和parallel指令合起来形成parallel for指令使用,也可以单独用在parallel语句的并行块中。其语法如下:

例如有这样一个例子:

#pragma omp parallel for
for ( int j = 0; j < 4; j++ )
{

printf(“j = %d, ThreadId = %d\n”, j, omp_get_thread_num());
}

可以得到如下结果:

img

从结果可以看出,for循环的语句被分配到不同的线程中分开执行了。需要注意的是,如果不添加parallel关键字,那么四次循环将会在同一个线程里执行,结果将会是下面这样的:

img

4. sections和section的用法

section语句是用在sections语句里用来将sections语句里的代码划分成几个不同的段,每段都并行执行。用法如下:

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注Go)
[外链图片转存中…(img-GvCY3MjA-16)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://yundeesoft.com/116081.html

(0)
上一篇 2024-11-18 16:33
下一篇 2024-11-18 16:45

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信