OpenACC读书笔记(一)

简介: 今年运气比较好,学了cuda之后,了解到了gpu的另两种使用语言opencl和openacc, opencl(Open Computing Language ,开放计算语言)是面向异构系统的并行编程语言的免费标准,支持多种设备,包含CPU(多核多线程CPU),GPU(NVIDIA,AMD),数字信号处理器(居然还支持DSP),但缺点是对源代码进行并行改进的代码量较大; O

今年运气比较好,学了cuda之后,了解到了gpu的另两种使用语言opencl和openacc,
opencl(Open Computing Language ,开放计算语言)是面向异构系统的并行编程语言的免费标准,支持多种设备,包含CPU(多核多线程CPU),GPU(NVIDIA,AMD),数字信号处理器(居然还支持DSP),但缺点是对源代码进行并行改进的代码量较大;
OpenACC与cudac和opencl不同,不需要学习相对更底层的东西,不需要对代码进行很大的改进,在代码中间加上相应的指令,再用相应的编译器进行编译就能对源程序进行加速,因为是编译器自动转换为并行处理的语言所以效率比不上用cuda或着用OpenCL对源代码进行改进的效率,而且现在OpenACC只支持C/C++,Fortran(比较幸运的是之前支持OpenACC的编译器PGI只能免费试用1个月,购买要正版1w多,今年刚刚开放社区版即免费版本,这么好的东西不试一下太可惜了)
OpenACC指令包含 导语和子语两部分如:

#pragma acc loop independent

中#pragma acc loop 是导语,independent是子语,导语的作用是告诉编译器接下来代码中大致要转换为怎样的并行代码(实现什么功能),子语的作用是帮助编译器更精确地改代码,具体的作用可以在用的过程中理解;
要使用OpenACC的指令要使用相应的编译器,比如gcc不支持OpenACC
用以下代码来验证:

#include<stdio.h>
#ifdef _OPENACC
#include<openacc.h>
#endif
int main()
{
    #ifdef OPENACC
        printf("Number of device :%d\n",acc_get_num_devices(acc_device_not_host));
    #else
        printf("OpenACC is not support.\n");
    #endif
    return;
}

如果用gcc进行编译
gcc test.c -o test.c
./test.exe
会出现 OpenACC is not support
用支持OpenACC的PGI编译器进行编译:
pgcc -acc test.c -o test.exe
./test.exe
会出现Number of device :1
支持OpenACC的设备为一个
像cuda一样先学习循环数组进行

#include<stdio.h>
#define N 256
int main()
{
    int i,a[N],b[N],c[N];
    for(i=0;i<N;i++)
    {
        a[i]=0;
        b[i]=c[i]=i;
    }
    #pragma acc kernels
    for(i=0;i<N;i++)
    {
        a[i]=b[i]+c[i];
    }
    printf("a[N-1]=%d \n",a[N-1]);
    return 0;

}

这里通过在循环前面加上#pragma acc kernels指令来将下面的循环改为并行处理。
通过pgcc进行编译后执行可以得到结果;
pgcc -acc -Minfo klc.c -o klc.exe
通过在 选项-Minfo可以返回一些编译信息:
设置PGI编译器环境的变量:export PGI_ACC_NOTITY=1
将环境变量告诉编译器可以得到运行程序时输出的一些CUDA内核配置
./klc.exe
launch CUDA kernel file=…
function =main line=12 device=0,threadid=1 num_gangs=2 num_workers=1 vector_length=128 grid=2 block=128
OpenACC中gangs,workers,vectors类似于CUDA中的grids,blocks,threads来表示线程数,线程块数,不同的是在CUDA中这些量可以表示为三维的结构,而在OpenACC中表示为一维,其中gangs对应blocks,workers、vectors对应threads;
读《OpenACC并行编程实战》后记
这里写图片描述

目录
相关文章
|
Linux 网络安全 数据安全/隐私保护
Linux 超级强大的十六进制 dump 工具:XXD 命令,我教你应该如何使用!
在 Linux 系统中,xxd 命令是一个强大的十六进制 dump 工具,可以将文件或数据以十六进制和 ASCII 字符形式显示,帮助用户深入了解和分析数据。本文详细介绍了 xxd 命令的基本用法、高级功能及实际应用案例,包括查看文件内容、指定输出格式、写入文件、数据比较、数据提取、数据转换和数据加密解密等。通过掌握这些技巧,用户可以更高效地处理各种数据问题。
1984 8
|
存储 关系型数据库 MySQL
客户说|乐檬零售引入PolarDB:查询性能百倍提升,稳定支撑超10万家门店
客户说|乐檬零售引入PolarDB:查询性能百倍提升,稳定支撑超10万家门店
592 2
客户说|乐檬零售引入PolarDB:查询性能百倍提升,稳定支撑超10万家门店
|
Cloud Native 编译器 Linux
如何在Windows、Mac和Linux操作系统上安装Protocol Buffers(protobuf)编译器
如何在Windows、Mac和Linux操作系统上安装Protocol Buffers(protobuf)编译器
1176 0
|
Ubuntu Linux 虚拟化
安装Windows Linux 子系统的方法:适用于windows 11 版本
本文提供了在Windows 11系统上安装Linux子系统(WSL)的详细步骤,包括启用子系统和虚拟化功能、从Microsoft Store安装Linux发行版、设置WSL默认版本、安装WSL2补丁,以及完成Ubuntu的首次安装设置。
6013 2
|
SQL 存储 Java
Java中ORM框架的选择及其应用指南
Java中ORM框架的选择及其应用指南
|
网络性能优化 调度
软件项目常见风险及其预防措施
(1)合同风险 签订的合同不科学、不严谨,项目边界和各方面责任界定不清楚等是影响项目成败的重大因素之一。 预防这种风险的办法是项目建设之初项目经理就需要全面准确地了解合同各条款的内容、尽早和合同各方就模糊或不明确的条款签订补充协议。
7512 0
|
边缘计算 人工智能 运维
行业场景智能应用 解锁边缘计算时代新机遇 阿里云混合云一体机重磅升级
阿里云混合云(Apsara Stack)首个全自研原生混合云,与阿里云公共云同宗同源、经过大规模商用验证、历经多年双11考验,是阿里云建管用一体化的全栈混合云平台,助力企业级客户全栈建云、智能管云、极致用云。未来,阿里云混合云将持续技术创新和优化服务能力,帮助客户更高效、更安全的上云,是政企数智创新的同行者。
645 0
行业场景智能应用 解锁边缘计算时代新机遇 阿里云混合云一体机重磅升级
|
机器人
gazebo里 关节是如何动起来的
gazebo里 关节是如何动起来的
gazebo里 关节是如何动起来的
|
Web App开发 iOS开发 Python
pyhon webbrowser 自动打开浏览器
pyhon webbrowser 自动打开浏览器