原文链接

在PGI的官方网站上获得示例代码:

http://www.pgroup.com/lit/samples/pgi_accelerator_examples.tar

我们的第一个例子从一个简单的程序开始。这个程序是把一个浮点向量送到GPU上,然后乘以2.再把结果返回。
整个程序是:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <assert.h>
 4 int main( int argc, char* argv[] )
 5 {
 6 int n; /* size of the vector */
 7 float *a; /* the vector */
 8 float *restrict r; /* the results */
 9 float *e; /* expected results */
10 int i;
11 if( argc > 1 )
12 n = atoi( argv[1] );
13 else
14 n = 100000;
15 if( n <= 0 ) n = 100000;
16 a = (float*)malloc(n*sizeof(float));
17 r = (float*)malloc(n*sizeof(float));
18 e = (float*)malloc(n*sizeof(float));
19 /* initialize */
20 for( i = 0; i < n; ++i ) a[i] = (float)(i+1);
21 #pragma acc kernels loop
22 for( i = 0; i < n; ++i ) r[i] = a[i]*2.0f;
23 /* compute on the host to compare */
24 for( i = 0; i < n; ++i ) e[i] = a[i]*2.0f;
25 /* check the results */
26 for( i = 0; i < n; ++i )
27 assert( r[i] == e[i] );
28 printf( “%d iterations completed\n”, n );
29 return 0;
30 }

请注意,在对指针r的声明中使用了 restrict 关键字; 我们很快就会知道为什么。
还请注意,定义浮点常量2.0f 而不是2.0 。在默认情况下,C语言的浮点常量是双精度。表达式a*2将会作为双精度计算,就好像(float)((double)a * 2.0)。为了避免这样,定义浮点常量,或者使用编译器选项-Mfcon,这样告诉编译器将浮点指针常量默认为通常的浮点来处理。
我们把进入GPU的循环之前放了一个kernals loop指令。这是告诉编译器去在查找循环的并行性,将数据传输到GPU上,在GPU上进行计算,然后将数据返回。对于这个程序,很简单。只需要输入下面的命令:

% pgcc -o c1.exe c1.c -acc -Minfo

也可以输入如下命令:

请注意-acc和-Minfo指令。-acc可以在编译器里启动OpenACC指令,默认情况下,PGI编译器认为目标加速区域在一个NVIDIA GPU上。我们会在后面的例子里演示其他的选项。
-Minfo指令就是从编译器上获得信息。我们将在我们的例子里解释这些信息代表的意思。当你在调试性能的时候,你会非常想了解这些信息的意思。
如果一切都安装正确,你就会从pgcc上获得以下信息:

1 main:
2 24, Generating copyout(r[:n])
3 Generating copyin(a[:n])
4 Generating compute capability 1.0 binary
5 Generating compute capability 2.0 binary
6 25, Loop is parallelizable
7 Accelerator kernel generated
8 25, #pragma acc loop gang, vector(128)
9 /* blockIdx.x threadIdx.x */

让我解释几个信息,首先是:
Generating copyout(r[:n]) 
就是告诉你在GPU上分配了数组r, 在循环执行后,把数据从GPU上复制回主机上。 
Generating copyin(a[:n]) 
就是告诉你编译器认为数组a 为循环的输入,因此数组a的n个元素需要从CPU上复制到GPU上。
Loop is paralleizable
就是告诉你编译器分析循环体的参数后认为所有的迭代可以并行执行。我们增加了restrict关键词在指针r的声明,否则编译器不能确保a和r指向不同的mermory
Accelerator kernal generated
这是告诉你,编译器已经成功地把循环体转化成GPU的一个内核。这个内核是GPU自己的函数,由编译器产生,将会被程序调用,并在GPU上并行执行。
这样,你准备运行程序。假设你是在GPU设备上执行,只需要输入执行文件的名字,acc_c1.exe.如果你得到一个信息 
libcuda.so not found, exiting
那么你可能是没有在它默认的位置安装CUDA驱动。你可能不得不设置环境变量LD_LIBRARY_PATH.
程序运行结束,你应该会看到一个结果:
100000 iterations completed
你如何知道哪些在GPU上执行?你可以设置环境变量ACC_NOTIFY为1.
csh: setenv ACC_NOTIFY 1
bash: export ACC_NOTIFY=1
然后重新运行程序。它会指出每次一个GPU内核执行的行数。在这个程序中,你会看到下面的结果:
launch kernel file=acc_c1.c function=main
line=25 device=0 grid=391 block=25
这是告诉你内核的文件名,函数,以及行数,CUDA grid和线程块的大小。
你可能不想给你所有的程序都设置这个环境变量,但在程序开发和测试的时候,这是个有用的办法。

转载于:https://www.cnblogs.com/liangliangdetianxia/p/4356153.html

编写第一个OpenACC程序相关推荐

  1. 【(Python解释器、Pycharm)安装教程】【使用PyCharm编写第一个Python程序】

    视频.源码.课件.软件.笔记:超全面Python基础入门教程[九天课程]博客笔记汇总表[黑马程序员] 目   录 1.Python 解释器 安装 1.1.手动配置环境变量步骤 2.PyCharm 程序 ...

  2. 用java编写一个图书管理系统_手把手教你编写第一个java程序

    安装完jdk后我们就可以试着编写第一个java程序了,让我们一起来试试吧! 第一步 点击开始--所有程序--附件--记事本,新建记事本,输入以下代码: class HelloWorld { publi ...

  3. 二.编写第一个c#程序(注释,命名空间,类,Main方法,标识符,关键字,输入,输出语句,)...

    复习编写一个控制台应用程序,目标是在控制台输出"Hello World" 1.第一步,打开Visual Studio 2012以上版本(我用的是VS 2015),打开完成后出现以下 ...

  4. 编写第一个Java程序:helloworld

    配置好java开发环境后,我们可以编写第一个java程序(helloworld). 在开始编写java程序时,我们要知道java程序开发的三个步骤:编写.编译.运行. 编写阶段主要是由程序员编写后缀为 ...

  5. vs2008编写第一个Windows程序

    vs2008编写第一个Windows程序 我们编写单击MouseClick事件的处理程序,当鼠标单击窗体时,在窗体的标题栏显示"这是我的第一个Windows程序". 1.在窗体设计 ...

  6. mac安装golang,编写第一个go程序

    一:下载pkg包,官网经常打不开,这里从云盘中下载 二:然后安装,一直next,命令行输入go version 或 go env如下说明成功 三:编写第一个go程序,新建hellow.go文件 pac ...

  7. 《教我兄弟学Android逆向01 编写第一个Android程序》

    前言 之所以准备写这一系列逆向的教程是因为有一些同学私信我说自己想学习Android逆向但是不知道怎么去学习 包括自己身边的一些计算机专业的同学 在大学里面老师讲的那些东西要么是自己不感兴趣 要么是自 ...

  8. eclipse怎么编写java程序_简单使用Eclipse编写第一个Java程序

    文章作者:姜南(Slyar)文章来源:Slyar Home (www.slyar.com) 转载请注明,谢谢合作. Eclipse是很常用的Java IDE,至少我们学校教Java都是用这个.下载就不 ...

  9. 用记事本编写第一个Java程序运行时 出现报错:错误: 类helloworld是公共的, 应在名为 helloworld.java 的文件中声明 public class helloworld {

    在书本上盲人摸象的摸索学习Java,Java环境配置完成,安装好eclipse后,便兴冲冲的去在记事本上编写第一个Java程序,结果给破了一盆冷水,略懵 public class helloworld ...

最新文章

  1. 更轻量的 View Controllers
  2. 神奇的HTML5离线存储(应用程序缓存)
  3. SAP Commerce Cloud 里的 Media 概念简述
  4. 收集很实用的 Linux 高级命令
  5. 看张子阳的书真是收获很多,也醒悟了很多(一)
  6. DB2连接不上mysql数据库_一次DB2数据库连接失败(SQLSTATE=08001)的解决方法
  7. 【SQL】找出行数与自增标识值不相等的表(即有缺行)
  8. JS几种数组遍历方式以及性能分析对比
  9. 汉子拼音不认识缤纷_儿童学拼音app哪个最好
  10. 懒人神器——自制自动写字机
  11. 怎么计算crc16校验数据的校验码
  12. 联想V470C 禁用触摸板
  13. TEXT到EPUB格式转换
  14. 利用朴素贝叶斯原理过滤垃圾邮件(TF-IDF算法)
  15. 斯坦福UE4 + C++课程学习记录 18:十字准星
  16. js字符串转日期时间,并比较大小
  17. matlab频域滤波处理,手动滤波,图像去网格背景:频域中手动选择目标区域进行滤波,滤掉噪声,灵活地达到理想的效果。
  18. HTML和CSS标记如何记忆,html和css技巧记忆轻松掌握
  19. 2017年Web前端技术综述
  20. 【Photoscan/Metashape 使用说明书笔记】

热门文章

  1. JS实例:网页上图片延迟加载的JS代码
  2. EMNLP 2021-多模态Transformer真的多模态了吗?论多模态Transformer对跨模态的影响
  3. 这个深度学习工业质检工具,效率提升30%,质量提高80%
  4. 成都理工大学“自然地理学”专业转行AI之路(精彩直播回放)
  5. 旷视提出Circle Loss,革新深度特征学习范式 |CVPR 2020 Oral
  6. 友情提示!距离CVPR 2020截稿还剩2天!
  7. 资源分享 | 知识蒸馏总结、应用与扩展(2015-2019)
  8. linux如何将文件夹添加到书签,桌面应用|[新手技巧] 如何在Ubuntu中添加和删除书签...
  9. 伯克利2019深度学习课程—李沐及其亚马逊同事一起讲述(内附视频链接及PDF下载)
  10. Geoffrey Hinton大佬经典的《神经网络机器学习》,附PPT下载链接!