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

OpenMP出现Stack Overflow及其疑问

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

#include <stdio.h>
#include <math.h>
#include <omp.h>#define ITER 100000000void 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 100000000void 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 100000void 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.mrgr.cn/news/78653.html

相关文章:

  • 【C++】从零到一掌握红黑树:数据结构中的平衡之道
  • 每日速记10道java面试题04
  • Leetcode 131 Palindrome Partition
  • 【娱乐项目】基于cnchar库与JavaScript的汉字查询工具
  • mac访达打开终端
  • vue实现滚动条滑动到底部分页调取后端接口加载数据
  • Kubernetes——part11 云原生中间件上云部署 Rocketmqkafkazookeeper
  • GPT的自回归语言建模(Autoregressive Language Modeling)
  • 科研小白成长记41——享受大起大落
  • 【排序用法】.NET开源 ORM 框架 SqlSugar 系列
  • 对拍详细使用方法
  • kubernetes——part3-2 集群声明式文件YAML
  • SQL优化与性能——数据库设计优化
  • Python中的六种“国际数字格式”实施方式
  • 刷LeetCode hot100--1.哈希表
  • Linux系统 异常控制流
  • 【CSS in Depth 2 精译_064】10.3 CSS 中的容器查询相对单位 + 10.4 CSS 容器样式查询 + 10.5 本章小结
  • 【连接池】.NET开源 ORM 框架 SqlSugar 系列
  • C_字符串其实就是字符数组
  • pcb线宽与电流
  • win10系统安装docker-desktop
  • 6.STM32之通信接口《精讲》之IIC通信---硬件IIC(STM32自带的硬件收发器)
  • 扩散模型_Diffusion Model
  • ffmpeg安装(windows)
  • 链表?->?(以尾插法说明,附头插法)
  • 输入一行字符,分别统计出其中英文字母、空格、数字和其它字符的个数。-多语言