MacOS利用CLion配置OpenMP多线程并行程序开发环境

2023-10-31 20:50

本文主要是介绍MacOS利用CLion配置OpenMP多线程并行程序开发环境,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

0 引言

  • 版本配置:

  • MacOS: Ventura 13.2.1

  • CLion: CLion2022.3.3

  • Xcode: 14.2

  • 以下是叨叨叨(完完全全可以跳过直接到步骤1...)

  • 大二下学期选修了《高性能计算导论》的课程,其中需要用到OpenMP环境的实验并撰写实验报告,就当我打开论坛准备开始配置的时候,发现事情并没有那么简单(裂),当课上使用windows的同学都开始跟着敲代码完成实验的时候,我还在跟着教程搭环境、看着终端上半分钟才增加一个的“#”发呆(可能是校园网太low)...

  • 当我花了大概3个小时的时间把环境搭建好并且能够在终端通过vim编写并且正常运行之后,想着通过IDE来编写并且调试omp项目而后开始美美做实验写报告的时候,事情又开始变得不简单了起来(裂*2),论坛上大多都是关于xcode的配置教程,但在进行教程中对/usr/local/bin目录下文件的修改时,mac甚至不给我权限进行修改,作罢几天后就想着,罢了罢了,用vim编写,在终端运行没什么大不了的。但当我看着程序坞中的CLion时陷入了沉思——去论坛搜搜!不可避免地失败了几次之后终于终于成功了!看着优雅的头文件和在IDE运行成果的结果感觉能开心好几天嘿嘿。

1 安装brew

  • 打开mac里的终端,输入:

Xcode-select -intall
  • 若出现以下代码段,则代表下载并安装插件成功

  • 接下来安装第二个插件brew,在终端输入命令:

/bin/zsh -c "$(curl -fsSL https://gitee.com/cunkai/HomebrewCN/raw/master/Homebrew.sh)"
  • 看到对应界面后,选择“2、清华大学下载源”,即输入序号:2

  • 当出现“Brew本体已经安装成功,接下来配置国内源。”字样以及下面的诸多选项时,代表brew的前期配置已经成功。

  • 接下来我们配置国内源,依旧输入序号:2,选择清华大学国内源。

  • 当出现“安装成功…………”字样时,代表已经安装成功。

2 安装llvm和libomp

  • 打开mac里的终端(若刚安装完brew则需要重启),输入:

brew install llvm

安装完成之后,在终端输入:

brew list

若在其中找到llvm,则代表安装成功。

  • 依然是在终端,输入:

brew install libomp

在完成一系列操作之后,在终端输入:

brew info libomp

可以在其中找到libomp所在的路径,需要记住(后面有用)。

3 在终端进行测试

  • 在桌面创建一个文件夹

cd ~
mkdir omp_test
  • 在omp_test文件夹中创建一个test.c文件:

cd omp_test
touch test.c

在当前文件夹目录下的终端中输入:

export OMP_NUM_THREADS=4
  • 编写test.c:

  • 在vim编辑器中打开test.c

vi test.c
  • 按键盘“i”键,进入编辑模式,复制以下代码:

#include <stdio.h>
#include <omp.h>int main(){int id, numb;omp_set_num_threads(4);#pragma omp parallel private(id, numb){id = omp_get_thread_num();numb = omp_get_num_threads();printf("I am thread %d out of %d\n", id, numb);}return 0;
}
  • esc,再输入:wq + enter保存。

  • 编译并执行:

  • 编译test.c文件:

gcc-12 -fopenmp test.c -o test

⚠️注意:若编译出现error,直接看【4 编译过程注意事项】!!!

  • 执行:

./test
  • 执行结果如下:

I am thread 1 out of 4
I am thread 2 out of 4
I am thread 0 out of 4
I am thread 3 out of 4

注意:结果中出现的数字不同也行,重要的是格式相同!

4 编译过程注意事项

  • 在调用omp.h库函数时,可能会出现找不到头文件的报错情况,这时候咱先不管它,可以直接include一个带绝对地址的header也未尝不可。

  • 故将上述代码中的#include <omp.h>改成#include </-*your path*-/include/omp.h>

  • 这里的-*your path*-即指的是在安装libomp时让大家记住的地址,见【2 安装llvm和libomp】

  • 故在我的电脑上,我将我的头文件改成了:

#include </opt/homebrew/Cellar/libomp/16.0.0/include/omp.h>
  • 这样做虽然不优雅,但能用。

  • 自此,若以上过程都解决了的话,则搭建OpenMP环境完成了,接下来是如何在IDE中使用的问题。

5 安装CLion并配置C/C++环境

  • 安装Xcode,直接在appstore里下载安装即可(这里需要用到xcode软件包里的内容)。

  • 安装和配置过程这里不再过多赘述,CLion一般会找到电脑目录下的c/c++。

  • 打开CLion,根据图示进行。

  • 安装插件,方便操作。⌘,  快捷打开设置界面,找到Plugins,安装插件。

  • 至此,CLion基础的C/C++环境配置完成。可能写的不是很详尽,具体可以在论坛或网站上搜索详细的教程。

6 在CLion配置OpenMP编译环境

  • 打开新建的omp_test文件后,按快捷键⌘,启动设置,在“构建、执行、部署”下的“工具链”中进行替换:

/usr/bin/gcc						# C编译器
/usr/bin/g++						# C++编译器
  • 退出设置后,在打开新建的main.cpp,在左侧项目中找到CMakeLists.txt,将以下内容进行替换:

cmake_minimum_required(VERSION 3.24)
project(omp_test)set(CMAKE_C_COMPILER "/usr/bin/gcc") #这里写你的gcc路径
set(CMAKE_CXX_COMPILER "/usr/bin/g++") #这里写你的g++路径
set(OPENMP_LIBRARIES "/opt/homebrew/Cellar/libomp/16.0.0/lib") #这里写你的libomp路径, 通过brew安装的默认地址
set(OPENMP_INCLUDES "/opt/homebrew/Cellar/libomp/16.0.0/include")#这里写你的libomp路径message("here")
message("${CMAKE_CXX_COMPILER}")OPTION (USE_OpenMP "Use OpenMP to enable <omp.h>" ON)# Find OpenMP
if(APPLE AND USE_OpenMP)if(CMAKE_C_COMPILER_ID MATCHES "Clang")set(OpenMP_C "${CMAKE_C_COMPILER}")set(OpenMP_C_FLAGS "-Xpreprocessor -fopenmp -lomp -Wno-unused-command-line-argument")set(OpenMP_C_LIB_NAMES "libomp" "libgomp" "libiomp5")set(OpenMP_libomp_LIBRARY ${OpenMP_C_LIB_NAMES})set(OpenMP_libgomp_LIBRARY ${OpenMP_C_LIB_NAMES})set(OpenMP_libiomp5_LIBRARY ${OpenMP_C_LIB_NAMES})endif()if(CMAKE_CXX_COMPILER_ID MATCHES "Clang")set(OpenMP_CXX "${CMAKE_CXX_COMPILER}")set(OpenMP_CXX_FLAGS "-Xpreprocessor -fopenmp -lomp -Wno-unused-command-line-argument")set(OpenMP_CXX_LIB_NAMES "libomp" "libgomp" "libiomp5")set(OpenMP_libomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})set(OpenMP_libgomp_LIBRARY ${OpenMP_CXX_LIB_NAMES})set(OpenMP_libiomp5_LIBRARY ${OpenMP_CXX_LIB_NAMES})endif()
endif()if(USE_OpenMP)find_package(OpenMP REQUIRED)
endif(USE_OpenMP)if (OPENMP_FOUND)include_directories("${OPENMP_INCLUDES}")link_directories("${OPENMP_LIBRARIES}")set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif(OPENMP_FOUND)add_executable(omp_test main.cpp)
  • 注意,在CMake文件中,

set(OPENMP_LIBRARIES "/opt/homebrew/Cellar/libomp/16.0.0/lib") #这里写你的libomp路径, 通过brew安装的默认地址
set(OPENMP_INCLUDES "/opt/homebrew/Cellar/libomp/16.0.0/include")#这里写你的libomp路径

以上路径可以在终端,通过输入brew info libomp获得,获得方式可见【2 安装llvm和libomp】以及【4 编译过程注意事项】

  • 第二行的project(omp_test),括号里的就是你最开始创建的文件夹的名字

  • 最后一行的add_executable(omp_test main.cpp),括号里,第一个是文件夹名字,第二个是要执行的c或cpp文件的名字。

  • 至此,环境搭建正式成功(撒花!!!!)

7 编写第一个OpenMP程序

  • 将以下代码粘贴至创造的c或cpp文件中:

#include <stdio.h>
#include <omp.h>int main(){
#pragma omp parallel sections{#pragma omp sectionfor(int i = 0;i < 5;++ i){printf("section i:iteration %d by thread no.%d\n", i, omp_get_thread_num());}#pragma omp sectionfor(int j = 0;j < 5;++ j){printf("section j:iteration %d by thread no.%d\n", j, omp_get_thread_num());}}return 0;
}
  • 右键,运行‘main’,出现结果:

section i:iteration 0 by thread no.0
section i:iteration 1 by thread no.0
section i:iteration 2 by thread no.0
section i:iteration 3 by thread no.0
section i:iteration 4 by thread no.0
section j:iteration 0 by thread no.1
section j:iteration 1 by thread no.1
section j:iteration 2 by thread no.1
section j:iteration 3 by thread no.1
section j:iteration 4 by thread no.1
  • 编译成功!

8 后言

当我在CLion中能够include一个不带绝对地址优雅的header时,我奇迹般发现在终端利用vim编写的也能不用带绝对地址的头文件了,好神奇,现在还不知道是因为什么。

配置完CLion后我从新整理心情尝试能够攻克一直无法在Xcode上配置环境的obstacle,真是可恶啊还是fail掉了,再修炼一会儿看看能不能处理掉这个麻烦。(其实Xcode很好用,只是体量特别壮硕,有好多现在还用不上但是不得不安装的东西。)

其实过程中遇到了很多问题都还没有解决,希望大家能够多多指正!

9 引用/参考

在mac OS下安装并使用OpenMP

MacOS配置OpenMP多线程并行程序开发环境步骤(完整版

MacOS 配置Clion的C/C++环境的详细步骤及mac终端报错问题解决(完整版)

在mac系统下使用clion编译运行openmp项目

这篇关于MacOS利用CLion配置OpenMP多线程并行程序开发环境的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/318039

相关文章

Zookeeper安装和配置说明

一、Zookeeper的搭建方式 Zookeeper安装方式有三种,单机模式和集群模式以及伪集群模式。 ■ 单机模式:Zookeeper只运行在一台服务器上,适合测试环境; ■ 伪集群模式:就是在一台物理机上运行多个Zookeeper 实例; ■ 集群模式:Zookeeper运行于一个集群上,适合生产环境,这个计算机集群被称为一个“集合体”(ensemble) Zookeeper通过复制来实现

这15个Vue指令,让你的项目开发爽到爆

1. V-Hotkey 仓库地址: github.com/Dafrok/v-ho… Demo: 戳这里 https://dafrok.github.io/v-hotkey 安装: npm install --save v-hotkey 这个指令可以给组件绑定一个或多个快捷键。你想要通过按下 Escape 键后隐藏某个组件,按住 Control 和回车键再显示它吗?小菜一碟: <template

CentOS7安装配置mysql5.7 tar免安装版

一、CentOS7.4系统自带mariadb # 查看系统自带的Mariadb[root@localhost~]# rpm -qa|grep mariadbmariadb-libs-5.5.44-2.el7.centos.x86_64# 卸载系统自带的Mariadb[root@localhost ~]# rpm -e --nodeps mariadb-libs-5.5.44-2.el7

Hadoop企业开发案例调优场景

需求 (1)需求:从1G数据中,统计每个单词出现次数。服务器3台,每台配置4G内存,4核CPU,4线程。 (2)需求分析: 1G / 128m = 8个MapTask;1个ReduceTask;1个mrAppMaster 平均每个节点运行10个 / 3台 ≈ 3个任务(4    3    3) HDFS参数调优 (1)修改:hadoop-env.sh export HDFS_NAMENOD

hadoop开启回收站配置

开启回收站功能,可以将删除的文件在不超时的情况下,恢复原数据,起到防止误删除、备份等作用。 开启回收站功能参数说明 (1)默认值fs.trash.interval = 0,0表示禁用回收站;其他值表示设置文件的存活时间。 (2)默认值fs.trash.checkpoint.interval = 0,检查回收站的间隔时间。如果该值为0,则该值设置和fs.trash.interval的参数值相等。

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

wolfSSL参数设置或配置项解释

1. wolfCrypt Only 解释:wolfCrypt是一个开源的、轻量级的、可移植的加密库,支持多种加密算法和协议。选择“wolfCrypt Only”意味着系统或应用将仅使用wolfCrypt库进行加密操作,而不依赖其他加密库。 2. DTLS Support 解释:DTLS(Datagram Transport Layer Security)是一种基于UDP的安全协议,提供类似于

嵌入式QT开发:构建高效智能的嵌入式系统

摘要: 本文深入探讨了嵌入式 QT 相关的各个方面。从 QT 框架的基础架构和核心概念出发,详细阐述了其在嵌入式环境中的优势与特点。文中分析了嵌入式 QT 的开发环境搭建过程,包括交叉编译工具链的配置等关键步骤。进一步探讨了嵌入式 QT 的界面设计与开发,涵盖了从基本控件的使用到复杂界面布局的构建。同时也深入研究了信号与槽机制在嵌入式系统中的应用,以及嵌入式 QT 与硬件设备的交互,包括输入输出设

OpenHarmony鸿蒙开发( Beta5.0)无感配网详解

1、简介 无感配网是指在设备联网过程中无需输入热点相关账号信息,即可快速实现设备配网,是一种兼顾高效性、可靠性和安全性的配网方式。 2、配网原理 2.1 通信原理 手机和智能设备之间的信息传递,利用特有的NAN协议实现。利用手机和智能设备之间的WiFi 感知订阅、发布能力,实现了数字管家应用和设备之间的发现。在完成设备间的认证和响应后,即可发送相关配网数据。同时还支持与常规Sof

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推