高性能计算之OpenMP——超算习堂学习1

OpenMP学习1------超算习堂

一、for循环并行

运用预编译命令:

c 复制代码
#pragma omp parallel for
	for(......)
	{
		/* Content */
	}

1.1、举个实例,对比性能

cpp 复制代码
#include <omp.h>
#include <cstdio>
#include <cstdlib>//用到rand()函数
#include <ctime>   //用到clock()函数

const int maxn = 1e8;

int main()
{
	int begintime, endtime;
	printf("It is use parallel compute:\n");

	begintime = clock();	//计时开始
#pragma omp parallel for
	for (int i = 0; i < maxn; ++i);
	endtime = clock();	//计时结束
	printf("\n\nRunning Time:%dms\n", endtime - begintime);


	printf("\n\n\nIt is not use parallel compute:\n");
	begintime = clock();	//计时开始
	for (int i = 0; i < maxn; ++i);
	endtime = clock();	//计时结束
	printf("\n\nRunning Time:%dms\n", endtime - begintime);
	return 0;
}

性能差距如下:

二、控制参与计算的线程数

cpp 复制代码
#include <omp.h>
#include <cstdio>
#include <cstdlib>//用到rand()函数
#include <ctime>   //用到clock()函数

const int maxn = 1e8;

int main()
{
	int begintime, endtime;
	int nthreads;
	printf("It is use parallel compute:\n\n\n");
#pragma omp parallel
	nthreads = omp_get_num_threads();
	printf("Now, it is %d threads\n", nthreads);
	begintime = clock();	//计时开始
#pragma omp parallel for
	for (int i = 0; i < maxn; ++i);
	endtime = clock();	//计时结束
	printf("\nRunning Time:%dms\n", endtime - begintime);

#pragma omp parallel
	nthreads = 12;
	omp_set_num_threads(nthreads);
	printf("\nNow, it is %d threads\n", nthreads);
	begintime = clock();	//计时开始
#pragma omp parallel for
	for (int i = 0; i < maxn; ++i);
	endtime = clock();	//计时结束
	printf("\nRunning Time:%dms\n", endtime - begintime);

	printf("\nIt is not use parallel compute:\n");
	begintime = clock();	//计时开始
	for (int i = 0; i < maxn; ++i);
	endtime = clock();	//计时结束
	printf("\nRunning Time:%dms\n", endtime - begintime);
	return 0;
}

修改之前的那一份代码,首先用函数:

cpp 复制代码
int nthreads = omp_get_num_threads();

获知当前并行计算的的线程数,我这边默认的线程数是 8 个线程。需要注意的是,omp的函数接口,一定要写在并行区域内,也就是宏指令内!!!

看看效果:
提出一个思考:

如果我设置的并行线程数只有 1 ,那么它和串行计算相比较,效率结果会如何呢??

实验一下:

cpp 复制代码
#pragma omp parallel
	nthreads = 1;
	omp_set_num_threads(nthreads);
	printf("\nNow, it is %d threads\n", nthreads);
	begintime = clock();	//计时开始
#pragma omp parallel for
	for (int i = 0; i < maxn; ++i);
	endtime = clock();	//计时结束
	printf("\nRunning Time:%dms\n", endtime - begintime);

	printf("\nIt is not use parallel compute:\n");
	begintime = clock();	//计时开始
	for (int i = 0; i < maxn; ++i);
	endtime = clock();	//计时结束
	printf("\nRunning Time:%dms\n", endtime - begintime);

看看结果:

可以看到:单线程的并行计算要比串行计算慢了近1倍!!!为什么呢?

其实不难理解,但线程非但没有进行计算任务的分配(就他一个光杆司令,没法分配),但是宏指令下的还是并行,所以线程间不起作用的并行过程拖延了时间!!导致了上述的结果。

三、OpenMP的并行计算模式

OpenMP和之前我们学习的MPI有着较大的区别,那就是计算模式:

MPI:核心是不共享内存,并行计算依赖于消息传递,只有消息传递各个进程间才能共享数据。只有共享数据才能做到并行计算。因此,MPI的计算模式是所有进程运行同样的程序,这个程度都是一样的,也都是完整的。如何确定消息的收发方依赖于进程的秩。

OpenMP:核心是插入并行语句块,各个线程间共享内存。依赖private和shared指令来区分各个线程在并行区计算的数据是否共享。然后需要等待并行计算区的语句全都执行完,然后一定会回到串行程序,直到程序运行结束。

相关推荐
蜗牛互联网4 小时前
Python + JSON Schema 实现工单结构化输出与本地复核
java·人工智能·后端
逐光者9334 小时前
STM32——SPI 屏 · Flash · 高速
java·前端·stm32
摸鱼 特供版4 小时前
一款边录边标注的轻量截图录屏工具
windows·学习·电脑·音视频·软件需求
wuminyu4 小时前
ForkJoinPool窃取线程在扫描其他WorkQueue时的随机采样算法与Phase线程挂起唤醒机制解析
java·linux·c语言·jvm·c++
陈年老古董4 小时前
Hive 函数学习笔记(下):窗口函数与经典案例
hive·笔记·学习
Sarvartha4 小时前
内部类知识
java·开发语言
Knight_AL4 小时前
从 EasyExcel 到 Apache Fesod:Java Excel 处理生态的一次重构
java·apache·excel
yuniko-n4 小时前
【JUC】集合线程安全
java
骑着蜗牛撵大象3275 小时前
服务下线不再炸:分层关闭、TCP 存活探测与负载均衡排水的落地套路
android·tcp/ip·负载均衡·tcp·高可用·健康检查·优雅关闭
罗西的思考5 小时前
[Agent Memory / 强化学习] MemPO源码学习笔记 — (6)— 奖励机制
人工智能·笔记·学习