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并行编程实战》后记
这里写图片描述

目录
相关文章
|
JSON 前端开发 JavaScript
富文本编辑器Ueditor实战(三)-springboot集成
通过本文,您可了解springboot如何集成ueditor,如何自定义扩展后端的文件上传功能。
1265 0
富文本编辑器Ueditor实战(三)-springboot集成
|
关系型数据库 Linux Apache
|
存储 人工智能 监控
RFID为化工厂人员安全提供有力保障
RFID技术通过实时定位、动态追踪与智能管控,为化工厂人员安全提供全方位保障。应用于人员定位监控、出入管控、考勤管理及紧急疏散等场景,具备抗干扰、非接触识别、高实时性等优势,助力化工厂构建智能安全防线,推动安全管理向主动预防转型。
|
人工智能 自然语言处理 测试技术
通义灵码入选 “2025 年值得关注的 AIGC 产品”,是唯一入选的 AI 编程产品
阿里云的通义灵码是一款基于通义大模型的AI编程助手,能够智能生成代码、优化结构、排查错误并自动生成测试用例,支持多种主流编程语言。在2025年入选《值得关注的AIGC产品》榜单,凭借卓越技术与广泛应用场景成为国内开发者首选。通义灵码已在国内多个行业落地,大幅提升开发效率与代码质量,同时针对中文编程场景优化,支持企业内网部署保障数据安全,推动AI编程技术在教育与科研领域的创新应用。
|
Cloud Native 编译器 Linux
如何在Windows、Mac和Linux操作系统上安装Protocol Buffers(protobuf)编译器
如何在Windows、Mac和Linux操作系统上安装Protocol Buffers(protobuf)编译器
1375 0
|
传感器 机器学习/深度学习 人工智能
自己都站不稳,怎么护理人?智能机器人的自主平衡问题,用TRIZ和DeepSeek有解吗?
法思诺创新探讨机器人自主平衡难题,结合TRIZ创新理论与DeepSeek大模型,为仿人机器人动态平衡提供解决方案。文章分析了机器人平衡差的原因,包括复杂环境、传感器限制、算法难度和机械设计挑战等,并提出通过TRIZ原理(如矛盾识别、理想解)与DeepSeek的AI能力(如数据学习、强化学习)协同优化平衡性能。展望未来,2024-2028年将实现从实验室验证到家用场景落地,推动消费级人形机器人发展。
671 0
|
网络性能优化 调度
|
SQL 关系型数据库 数据库
|
应用服务中间件 nginx
Nginx服务器的反向代理proxy_pass配置方法讲解
 Nginx服务器的反向代理proxy_pass配置方法讲解 这篇文章主要介绍了Nginx服务器的反向代理proxy_pass配置方法讲解,包括经常被提到的url的/问题的相关说明,需要的朋友可以参考下 就普...
6298 0
|
网络协议 物联网
刚才,我们宣布推出了IPv6转换服务
随着海量智能设备的出现和新兴网络技术如5G、物联网的发展,网络应用对IP地址的需求呈现爆炸式增长。 大家所不了解的事实是全球IPv4地址,也就是现在大部分设备在使用的标准地址,已经枯竭。我国7.51亿互联网用户仅有3.38亿个IPv4地址,人均拥有量仅有0.45个IPv4地址。
10410 1

热门文章

最新文章