▶ OpenACC 的原子操作,用到了 C++ 的一个高精度计时器

● 代码,直接的原子操作

 #include <iostream>
#include <cstdlib>
#include <chrono> #define ATOMIC using namespace std;
using namespace std::chrono; int main()
{
high_resolution_clock::time_point t1 = high_resolution_clock::now();// 高精度计时器 const int count = ;
int sum = ; #pragma acc parallel loop copyout(sum)
for (int i = ; i < count; i++)
{
#ifdef ATOMIC
#pragma acc atomic update
#endif
sum++;
} high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time = duration_cast<duration<double>>(t2 - t1); cout << "\nCount = " << count << ", duraion = " << time.count() << " s" << endl;
return ;
}

● 输出结果,不知道为什么,win10中的 pgCC 不能用

D:\Code\OpenACC\OpenACCProject\OpenACCProject>pgCC -acc -o acc_win10.exe main.cpp -Minfo
pgCC-Warning-C++ compilation is not supported: main.cpp

● 输出结果,WSL 中

// 不使用 OpenACC
cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ pgc++ -std=c++ -o acc.exe main.cpp -Minfo
cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ ./acc.exe Count = , duraion = 0.483907 s // 使用宏 ATOMIC,即使用原子操作
cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ pgc++ -acc -std=c++ -o acc.exe main.cpp -Minfo
main:
, Generating copyout(sum)
Accelerator kernel generated
Generating Tesla code
, #pragma acc loop gang, vector(128) /* blockIdx.x threadIdx.x */
cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ ./acc.exe Count = , duraion = 0.248377 s // 不用宏 ATOMIC,即不用原子操作
cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ pgc++ -acc -std=c++ -o acc.exe main.cpp -Minfo
main:
, Generating copyout(sum)
Accelerator kernel generated
Generating Tesla code
, #pragma acc loop seq
, Accelerator restriction: induction variable live-out from loop: sum // 编译器提示强制原子操作
cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ ./acc.exe Count = , duraion = 0.247399 s

● 优化一下,使用分段计数

 #include <iostream>
#include <cstdlib>
#include <chrono> using namespace std;
using namespace std::chrono; int main()
{
high_resolution_clock::time_point t1 = high_resolution_clock::now(); const int count = , length = count / ;// 每一段的长度
int sum = ; #pragma acc parallel loop copyout(sum)
for (int start = ; start < count; start+=length) // start 取每段的起点,共 count / length 段
{
const int end = (start + length < count) ? start + length : count; // 每段的终点
int subSum = ;
#pragma acc loop worker reduction(+:subSum)
for (int j = start; j < end; j++) // 每段从 start 加到 end
subSum ++; #pragma acc atomic update
sum += subSum; // 规约结果加到 sum 中来
} high_resolution_clock::time_point t2 = high_resolution_clock::now();
duration<double> time = duration_cast<duration<double>>(t2 - t1); cout << "\nCount = " << sum << ", duraion = " << time.count() << " s" << endl;
return ;
}

● 输出结果,好像好一点点

cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ pgc++ -acc -std=c++ -o acc.exe main.cpp -Minfo
main:
, Generating copyout(sum)
Accelerator kernel generated
Generating Tesla code
, #pragma acc loop gang /* blockIdx.x */
, #pragma acc loop seq /* threadIdx.y */
Generating reduction(+:subSum)
, Loop is parallelizable
cuan@CUAN:/mnt/d/Code/OpenACC/OpenACCProject/OpenACCProject$ ./acc.exe Count = , duraion = 0.246488 s

最新文章

  1. ipad和iphone的适配
  2. jQuery+fullPage.js演示10种全屏滚动
  3. auto(c++11)
  4. Ubuntu下PHP的扩展
  5. C#为工作Sql而产生的字符串分割小工具(很实用,你值得拥有)
  6. mac下为Apache 创建 .htaccess文件
  7. Ant编译和部署java web项目
  8. javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD
  9. delphi xe5 android 开发数据访问手机端(二)
  10. MSSQL 各个发行版本版本号以及Compact 版本号
  11. java static 执行顺序
  12. Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)
  13. (入门篇 NettyNIO开发指南)第五章-分隔符和定长解码器使用
  14. python爬取百度搜索结果ur汇总
  15. 学习string,stringBuffer时遇到的问题
  16. python 通过 http、dns、icmp判断网络状态
  17. Kettle解决方案: 第一章ETL入门
  18. J.U.C
  19. HTML5-indexedDB使用常见错误总结
  20. [日常工作]Win2008r2 以及更高版本的操作系统安装Oracle10.2.0.5

热门文章

  1. vue 钩子
  2. 【idea】如何将idea的项目路径设置成代码目录和配置文件目录
  3. hasura 的3factor 架构结论
  4. StreamSets 管理 SDC Edge上的pipeline
  5. IBM WebSphere MQ介绍安装以及配置服务详解(转)
  6. JUC线程池之 Callable和Future
  7. selenium启动谷歌所遇到的问题
  8. c# 模拟POST上传文件到服务器
  9. file_get_contents failed to open stream: HTTP request failed(一个字符决定成败)
  10. BASIC-30_蓝桥杯_阶乘计算