#pragma 是 C 和 C++ 语言中的一个预处置指令。它主要用于向编译器发送特定的信息或者指示,以便控制编译过程。#pragma 一般与编译器特定的选项或功能一块用,因此它的具体行为和达成可能因不一样的编译器而有所不同。
#pragma 的语法如下:
#pragmadirective_nameoptional_arguments
其中,directive_name 是一个编译器辨别的指示名字,optional_arguments 是可选的参数。
#pragma 的一些容易见到作用与功效包含:
优化:可以通过向编译器提供优化建议来改变生成的代码性能。比如,#pragma omp parallel for 用于 OpenMP 并行编程,以在循环中达成线程级并行。
诊断:可以启用或禁用特定的编译器警告。比如,#pragma warning(disable: 4996) 可以在 Visual Studio 中禁用特定警告。
代码段:可以将代码段驻留在特定的内存地区。比如,#pragma code_seg(MY_SECTION) 可以将代码段放置在名为 MY_SECTION 的内存地区中。
初始化和终止函数:可以指定在程序启动和退出时自动实行的函数。比如,#pragma startup func1 和 #pragma exit func2 分别指定 func1 和 func2 在程序启动和退出时实行。
数据对齐:可以控制数据结构成员的对齐方法。比如,#pragma pack(push, 1) 和 #pragma pack(pop) 分别设置和恢复数据对齐方法。
因为 #pragma 可能因编译器而异,建议查阅编译器的文档以知道支持的 #pragma 指令和有关功能。对于可移植性考虑,一般应尽可能防止用编译器特定的 #pragma。
2、C++不同版本不同C++ 有多个版本,其中经常见到的包含:
C++98/03:这是刚开始的 C++ 标准,也称为 ISO/IEC 14882:1998(C++98),后来进行了一些小修订,称为 ISO/IEC 14882:2003(C++03)。该标准引入了类、继承、多态、模板等面向对象编程特质。它还支持异常处置、RTTI(运行时种类辨别)和 STL(标准模板库)等功能。
C++11:也称为 ISO/IEC 14882:2011。该标准在 C++98 的基础上增加了很多新功能,如 lambda 表达式、右值引用、智能指针、constexpr 函数、nullptr 关键词、委托架构函数、变长模板等等。同时,它还对语言规范进行了一些修改和增强,以提升效率、可读性和可维护性。
C++14:也称为 ISO/IEC 14882:2014。该标准在 C++11 的基础上进行了一些小修订和改进。它主要增加了一些新特质,如二进制字面量、泛型 lambda 表达式、返回种类推导等。
C++17:也称为 ISO/IEC 14882:2017。该标准在 C++14 的基础上增加了很多新功能,如结构化绑定、内联变量、if constexpr、折叠表达式等。它还对语言规范进行了很多修改和增强,以便提升效率、可读性和可维护性。
C++20:也称为 ISO/IEC 14882:2020。该标准在 C++17 的基础上增加了很多新特质,如 concepts(定义)机制、三路比较运算符、协程、格式化 I/O 库等等。同时,它还增强了现有些功能,并修复了一些缺点和错误。
查询g++默认用的C++版本
g++-dM-E-xc++/dev/null|grep-F__cplusplus
版本对照表
指定不同版本编译器
vim~/.bashrcechoaliasg17=/g++-std=c++17/~/.bashrcsource~/.bashrc2、什么是OpenMP
OpenMP 是一套 C++ 并行编程框架, 也支持 Forthan .
它是一个跨平台的多线程达成, 可以使串行代码经过最小的改动自动转化成并行的。具备广泛的适应性。这个最小的改动,有时只不过一行编译原语!(在高阶示例中,大家将演示并评估加速性能)
具体达成是通过剖析编译原语#pragma,将用原语概念的代码块,自动转化成并行的线程去实行。每一个线程都将分配一个独立的id. 最后再合并线程结果。
OpenMP共享内存的并行编程框架基础知识解析
3、关键词1、reduction 用途在 OpenMP 中,reduction 用于将一个变量的值从多个线程中合并为单个结果。该指令提供了一个简单的办法来达成并行计算中的归约操作。
下面是 reduction 的语法示例:
#pragmaompparallelforreduction(+:sum)for(i=0;in;i++){sum+=a[i];}
在这个例子中,大家用了 + 运算符作为 reduction 操作符,并且要对变量 sum 进行归约。在实行并行循环时,每一个线程都会计算一部分的 sum 值,最后将这类值相加得到最后的结果。
其他的 reduction 操作符包含 -、*、、|、^ 和 、||。可以参考具体应用场景选择合适的操作符。
应该注意的是,被归约的变量需要满足以下条件之1、
全局变量(全局用途域)
静态变量(静态存储期)
分配在堆上的变量
在 parallel 或 task region 中概念的私有变量
另外,OpenMP 还支持自概念数据种类的归约操作,需要通过 omp declare reduction 指令来声明自概念操作符和数据种类的归约方法。
2、default(shared)用途default(shared)是OpenMP的一个指令,用于指定在并行计算中所有变量都是共享的。这意味着变量的存储将在所有线程之间共享,并且任何对变量的更改都将影响所有线程。用此指令可以确保所有线程都用相同的数据,由于它们都可以读取和修改共享变量。
请注意,用default(shared)或许会致使数据角逐和不同的结果。因此,在用并行计算时,需要谨慎地选择变量的共享方法,并采取适合的同步手段来防止数据冲突。






