当前位置: 首页 > article >正文

OpenMP出现Stack Overflow及其疑问

今天对着《OpenMP核心技术指南》练习OpenMP,其中一个案例:

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

#define ITER 100000000

void main()
{
	int i;
	double A[ITER];
	for (i = 0; i < ITER; i++)
		A[i] = 2.0 * i;

#pragma omp parallel
	{
		// int i;
		int id = omp_get_thread_num();
		double todata = omp_get_wtime();

#pragma omp for schedule(static)
		for (i = 1; i < ITER; i++)
			A[i] = A[i] * sqrt(i) / pow(sin(i), tan(i));

		todata = omp_get_wtime() - todata;

		if (id == 0)
			printf("Time spent is %lf sec \n", todata);
	}
}

在Windows的Visual Studio运行时报错了:
在这里插入图片描述

这个出错的位置比较有意思。

把Visual Studio的x64选项改成x86,运行成功:
在这里插入图片描述
先看看[Visual Studio] — Differences between x86, x64 and AnyCPU,关于Visual Studio的x86和x64选项是怎么回事?

1.32位操作系统和64位操作系统之间的区别:

(1) 32位CPU: 地址指针长度32位,可访问2^32个离散地址,这使得程序最多可以在内存中开出4GB的数据结构。

(2) 64位CPU: 地址指针长度64位,可以访问2^64个离散地址,这使得程序最多能在内存中开出16EB的数据结构

(3) 在物理内存的限制之外,64位CPU上的进程可以处理比32位CPU更大的数据集。

我这台电脑是64位操作系统。

试试把程序中的Openmp指令给注释掉,然后重新选择x64选项build然后运行:

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

#define ITER 100000000

void main()
{
	int i;
	double A[ITER];
	for (i = 0; i < ITER; i++)
		A[i] = 2.0 * i;

// ,#pragma omp parallel
	// {
		// int i;
		int id = omp_get_thread_num();
		double todata = omp_get_wtime();

// #pragma omp for schedule(static)
		for (i = 1; i < ITER; i++)
			A[i] = A[i] * sqrt(i) / pow(sin(i), tan(i));

		todata = omp_get_wtime() - todata;

		if (id == 0)
			printf("Time spent is %lf sec \n", todata);
	// }
}

运行成功。

看来这和OpenMP的机制有关了。

恢复之前的OpenMP指令,把数组大小降低到100000:

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

#define ITER 100000

void main()
{
	int i;
	double A[ITER];
	for (i = 0; i < ITER; i++)
		A[i] = 2.0 * i;

#pragma omp parallel
	{
		int i;
		int id = omp_get_thread_num();
		double todata = omp_get_wtime();

#pragma omp for schedule(static)
		for (i = 1; i < ITER; i++)
			A[i] = A[i] * sqrt(i) / pow(sin(i), tan(i));

		todata = omp_get_wtime() - todata;

		if (id == 0)
			printf("Time spent is %lf sec \n", todata);
	}
}

这样就运行成功了

具体原因还需要进一步查阅资料


http://www.kler.cn/a/417198.html

相关文章:

  • Vite 为什么快,是怎么打包的
  • 增加工作台菜单页面,AI问答应用支持上下文设置,数据库表索引优化,zyplayer-doc 2.4.8 发布啦!
  • 离线统信系统的python第三方库批量安装流程
  • 用AVFrame + AVPacket 完成accede编码和直接用ffmpeg命令行实现acc编码的对比
  • go语言中的反射
  • 树莓派5添加摄像头 在C++下调用opencv
  • 前端如何获取unpkg的资源链接
  • 《Vue 服务器端渲染(SSR):优化性能与 SEO》
  • 蓝桥杯模拟题不知名题目
  • MySQL - 性能优化
  • docker迁移gitlab的时候 遇到的一些问题
  • 【聊天室后端服务器开发】语音转换子服务
  • 物联网射频识别和RFID开发(二):RFID原理及硬件组成
  • SVM支持向量机分类——基于Python实现
  • 通信与网络基础
  • Python3交叉编译arm-linux放入设备中运行方式
  • kafka admin client 如何计算kafka发送速度
  • 在 Android 开发中,如何限制某个电话号码不能打电话或接听电话?
  • 【2024寒假实习面经】——CPP方向{篇Ⅰ}
  • MYSQL字段变更
  • Linux的介绍及虚拟机centOS系统的下载与应用
  • webGL入门教程_04vec3、vec4 和齐次坐标总结
  • Linux的文件系统
  • C语言 进制
  • 前端框架Vue3项目实战(基于Vue3实现一个小相册)
  • spring boot打包fat jar