▶ 使用 OpenACC 的 parallel 构件来计算规约,主要想说的是 win10 pgi 和 win10 WSL pgi 结果的不同和关于 for 循环的一个小坑

● 正常的代码

  1. #include <stdio.h>
  2. #include <openacc.h>
  3.  
  4. const int N = ;
  5.  
  6. int main()
  7. {
  8. int i, sum, temp, a[N];
  9. for (i = sum = temp = ; i < N; i++)
  10. a[i] = i;
  11.  
  12. #ifdef _OPENACC
  13. printf("device:%d, device nvidia:%d", acc_get_num_devices(acc_device_default), acc_get_num_devices(acc_device_nvidia));// 检查计算设别和 nvidia 计算设备数量
  14. #pragma acc parallel
  15. {
  16. #pragma acc loop reduction(+:sum) // 规约计算了 1+2+...+99
  17. for (i = ; i < N; i++)
  18. sum += a[i];
  19.  
  20. temp = sum; // 在退出 parallel 构件之前就尝试使用规约变量 sum
  21. }
  22. printf("\nSum = %d, temp = %d\n", sum, temp);
  23.  
  24. #else
  25. printf("\nACC not support.\n");
  26. #endif
  27. getchar();
  28. return ;
  29. }

● 输出结果(分别使用 win10 pgi 编译器和 win10 WSL pgi 编译器)

  1. D:\Code\OpenACC\OpenACCProject\OpenACCProject>pgcc main.c -o main.exe -acc -Minfo
  2. main:
  3. , Accelerator kernel generated
  4. Generating Tesla code
  5. , #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
  6. Generating reduction(+:sum)
  7. , Generating implicit copy(sum)
  8. Generating implicit copyin(a[:N])

  9. D:\Code\OpenACC\OpenACCProject\OpenACCProject>main.exe
    device:, device nvidia: // 只有一台计算设备,应该是独立显卡
    launch CUDA kernel  file=D:\Code\OpenACC\OpenACCProject\OpenACCProject\main.c function=main line=14 device=0 threadid=1 num_gangs=1 num_workers=1 vector_length=128 grid=1 block=128 shared memory=1024
    launch CUDA kernel  file=D:\Code\OpenACC\OpenACCProject\OpenACCProject\main.c function=main line=14 device=0 threadid=1 num_gangs=1 num_workers=1 vector_length=256 grid=1 block=256 shared memory=1024
  10. Sum = , temp = // 正确的计算了 1+2+...+99,temp 不能获得正确的结果
  1. cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ pgcc main.c -o main-ubuntu.exe -acc -Minfo
  2. main:
  3. , Accelerator kernel generated
  4. Generating Tesla code
  5. , #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
  6. Generating reduction(+:sum)
  7. , Generating implicit copy(sum)
  8. Generating implicit copyin(a[:N])
  9. cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ ./main-ubuntu.exe
  10. device:, device nvidia:0 // 只有一台计算设备,默认是 CPU ?而且没有输出 CUDA 内核的相关信息
  11. Sum = , temp = 4950 // temp 竟然是对的

● 大坑注意:

■ OpenACC 所有 for 循环仅支持简单语句(不仅限制并行构建),将上述代码中的第 9 ~ 10 行改成 for (i = sum = temp = ; i < N; a[i] = i++); 后会出现以下结果,但是如果使用 for (i = sum = temp = ; i < N; a[i] = i, i++); 是正确的。

  1. D:\Code\OpenACC\OpenACCProject\OpenACCProject>pgcc main.c -o main.exe -Minfo -acc
  2. main: // 编译没有出现错误提示
  3. , Accelerator kernel generated
  4. Generating Tesla code
  5. , #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
  6. Generating reduction(+:sum)
  7. , Generating implicit copy(sum)
  8. Generating implicit copyin(a[:N])
  9. D:\Code\OpenACC\OpenACCProject\OpenACCProject>main.exe
  10. device:, device nvidia: // 每次执行结果不同
  11. Sum = , temp =
  12.  
  13. D:\Code\OpenACC\OpenACCProject\OpenACCProject>main.exe
  14. device:, device nvidia:
  15. Sum = , temp =
  1. cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ pgcc main.c -o main-ubuntu.exe -acc -Minfo
  2. main: // 编译没有出现错误提示
  3. , Accelerator kernel generated
  4. Generating Tesla code
  5. , #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
  6. Generating reduction(+:sum)
  7. , Generating implicit copy(sum)
  8. Generating implicit copyin(a[:N])
  9. cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ ./main-ubuntu.exe
  10. device:, device nvidia: // 每次结果相同,但答案不正确
  11. Sum = , temp =
  12.  
  13. cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ ./main-ubuntu.exe
  14. device:, device nvidia:
  15. Sum = , temp =

OpenACC 计算规约时发现的小坑的更多相关文章

  1. 曲演杂坛--使用CTE时踩的小坑:No Join Predicate

    在一次系统优化中,意外发现一个比较“坑”的SQL,拿出来供大家分享. 生成演示数据: --====================================== --检查测试表是否存在 IF(O ...

  2. 使用constexpr时遇到的小坑

    最近在使用constexpr的时候无意中踩了个小坑. 下面给个小示例: #include <iostream> constexpr int n = 10; constexpr char * ...

  3. JDBC 连接 MySQL 时碰到的小坑

    最近从MS SQL Server换到了MySQL,已经是8.11版本了,安装的时候似乎还用了新的身份认证方式之类的,连接过程中也是磕磕绊绊,碰到很多奇奇怪怪的问题,在此记录下来. 驱动加载: 以前使用 ...

  4. 发现一个小坑的地方,unity的协程,想要停止,必须以字符串启动

    今天想要停止一个协成,发现调用 StopCoroutine(ShowDebug()); 竟然不管用,后来看了文档才知道,原来想要停止协成,必须用字符启动协程 StartCoroutine(" ...

  5. activiti设置customSessionFactories时的一个小坑

    现象:activiti设置customSessionFactories不起作用,流程还是走原来的查询方法原因:新实现的XXXEntityManagerFactory的getSessionType方法返 ...

  6. Vue中应用CORS实现AJAX跨域,及它在 form data 和 request payload 的小坑处理

    基本概念部分(一):理解CORS 说道Vue的跨域AJAX,我想先梳理一遍CORS跨域,"跨域资源共享"(Cross-origin resource sharing),它是一个W3 ...

  7. 使用EMMET中的小坑

    使用EMMET写HTML的时候,是一个非常爽的事情.但是今天我使用时,发现一个小坑.以前倒也没有注意,不过需要非常的小心. form[action="/process" metho ...

  8. vue 过滤器filters的使用以及常见报错小坑(Failed to resolve filter)

    今天使用vue 过滤器中发现一个小坑,网上查到的大都是不正确的解决方法,故分享给大家: 原错误代码: // 过滤器 filter:{ FdishList:function(value){ if (!v ...

  9. 注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式

    注意Android里TextView控件的一个小坑,用android:theme来设置样式时动态载入的layout会丢失该样式 这个坑,必须要注意呀, 比如在用ListView的时候,如果在List_ ...

随机推荐

  1. js 如何控制文本域输入内容在一定间隔时间段才触发事件查询相关数据

    <script>var flag = 0;var t;function openFlag () { t = setTimeout(function(){flag = 1; dosometh ...

  2. Windows10 解决“装了 .NET Framework 4.5.2/4.6.1/4.7.1等等任何版本 或版本更高的更新”问题

    ========================================================= 系统自带的.net framework版本为4.7,自己安装.NET Framewo ...

  3. 《DSP using MATLAB》Problem 4.5

    1. 2. 3. 5.不会

  4. 2017年最新cocoapods安装教程(解决淘宝镜像源无效以及其他源下载慢问题)

    首先,先来说一下一般的方法吧,就是把之前的淘宝源替换成一个可用的的源: 使用终端查看当前的源 gem sources -l gem sources -r https://rubygems.org/ # ...

  5. ImportTsv-HBase数据导入工具

    一.概述 HBase官方提供了基于Mapreduce的批量数据导入工具:Bulk load和ImportTsv.关于Bulk load大家可以看下我另一篇博文. 通常HBase用户会使用HBase A ...

  6. How Distributed Outer Joins on PostgreSQL with Citus Work

    转自: https://docs.citusdata.com/en/v7.5/articles/outer_joins.html SQL is a very powerful language for ...

  7. 【Android界面实现】AppWidght全面学习之电量监控小部件的实现具体解释

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/bz419927089/article/details/35791047 前几天翻看之前下载的各种资料 ...

  8. 检索关键字 nyoj

    检索关键字 时间限制: 1000ms 内存限制: 65536KB 64位整型:      Java 类名: 上一题 提交 运行结果 统计 讨论版 下一题 类型: 没有   没有   难度        ...

  9. coffeescript学习

    test2.coffeestdin = process.openStdin()stdin.setEncoding 'utf8' stdin.on 'data', (input) ->     n ...

  10. node 知识点

    问:局部安装如何使用npm run命令? 答:如果已局部安装了babel-cli(babel-cli自带babel-node命令),package.json文件配置如下: "scripts& ...