如果已经定义了宏_OPENMP,它是一个int类型的十进制数。编写一个程序打印它的值,这个值的意义是什么?

如果已经定义了宏_OPENMP,它是一个int类型的十进制数。编写一个程序打印它的值,这个值的意义是什么?,第1张

"_OPENMP" 是一个预处理器宏定义,用于标识 OpenMP 版本。它不是一个变量,因此不能有值。

OpenMP 定义了一组标准,用于编写多线程应用程序。"_OPENMP" 宏是一种方法,用于检测当前编译器是否支持 OpenMP。

如果编译器支持 OpenMP,则在编译时将定义 "_OPENMP",以便您可以使用 OpenMP 编写的代码。否则,将不定义 "_OPENMP",因此您不能使用 OpenMP。

例如:

#ifdef _OPENMP

#include <omp.h>

#endif

在上面的代码中,如果编译器支持 OpenMP,则包含 OpenMP 头文件 "omp.h"。否则,不包含该文件。

以上为chatgpt给出的答案,但是我查看_OPENMP的值是一个具有yyyy mm形式的日期,其中yyyy是4位年,mm是2位月。历蚂例如,2005年,05年。OpenMP标准规定,当定义宏时,它将是已实现的OpenMP标准版本的年份和月。请参见ex5.1_omp_macro.c。了微软的文档以后看到如下:

所以应该说这个宏的值是MSVC实现OPENMP规范的日期,但这个昌锋定义是MSVC的专属宏肢迅埋定义。希望能够帮助到你。

——————————————————2.15 修改————————————————

上面为官方给出的回答

以下为中文翻译:

_OPENMP的值是一个具有yyyy mm形式的日期,其中yyyy是4位年,mm是2位月。例如,2005年,05年。OpenMP标准规定,当定义宏时,它将是已实现的OpenMP标准版本的年份和月。请参见ex5.1_omp_macro.c。

以前利用多线程为拥有较大量计算的程序提速过,但也深知多线程的同步和程序的调试是一大坑,最近为实验室的项目学习了一点VS下优化代码的设置以及利用openmp加速运算,都是些很基本的提升程序速度的方法,只要稍微修改下代码和设置,就可使程序加速。配合多线程,经过clock()函数验证,我的程序运行可提高60%的速度,详细如下:

代码优化:

属性->配置属性->C/C++->代码生成:启用增强指令集,可选用 流式处理 SIMD 扩展 2 (/arch:SSE2) (/arch:SSE2)、流式处理 SIMD 扩展 2 (/arch:SSE2) (/arch:SSE2) 进行加速浮点模型,可选用 快速 (/fp:fast) 进行浮点数据运算的加速

属性->配置属性->C/C++->优化:可选用 使速度最大化 (/O2) 进行优化。全程序优化选择是(/GL),在debug版本下不能这样设置,必须在release版本

openmp并行计算:

在vs2012下,项目属性-》C/C++-》语言,openmp支持,选是,包含头文件“omp.h”,对基于数据分集的多线程程序设计,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函数的配对 *** 作函数,关闭一个锁

运行的慢是因为你的length太小。并行的话比串行需要时帆桐兆间去分,还需要时间再合。所以当你数据量太小时反而用串行的就比较快了。

你换成一亿就能看出差距了。

我没看出来哪有冲突。但是我觉得你上面赋值和算c那这么写也许效率更快态租。

#pragma omp parallel for

for(i=0i<lengthi++)

{

A[i] = (rand_r(&seed))%10

B[i] = (rand_r(&seed))%10

C[i] = (A[i]+B[i])/2

}

还有,你根本没用到头文件轮歼time.h啊。你写这个头文件干嘛?是不是想看运行时间啊。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/tougao/12300314.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-24
下一篇 2023-05-24

发表评论

登录后才能评论

评论列表(0条)

保存