OpenACC 简单的原子操作
2024-08-25 14:16:37
▶ 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
最新文章
- ipad和iphone的适配
- jQuery+fullPage.js演示10种全屏滚动
- auto(c++11)
- Ubuntu下PHP的扩展
- C#为工作Sql而产生的字符串分割小工具(很实用,你值得拥有)
- mac下为Apache 创建 .htaccess文件
- Ant编译和部署java web项目
- javaweb学习总结(三十三)——使用JDBC对数据库进行CRUD
- delphi xe5 android 开发数据访问手机端(二)
- MSSQL 各个发行版本版本号以及Compact 版本号
- java static 执行顺序
- Qt国际化(Q_DECLARE_TR_FUNCTIONS() 宏给非Qt类添加翻译支持,以前没见过QTextEncoder和QTextDecoder和QLibraryInfo::location()和QEvent::LanguageChange)
- (入门篇 NettyNIO开发指南)第五章-分隔符和定长解码器使用
- python爬取百度搜索结果ur汇总
- 学习string,stringBuffer时遇到的问题
- python 通过 http、dns、icmp判断网络状态
- Kettle解决方案: 第一章ETL入门
- J.U.C
- HTML5-indexedDB使用常见错误总结
- [日常工作]Win2008r2 以及更高版本的操作系统安装Oracle10.2.0.5
热门文章
- vue 钩子
- 【idea】如何将idea的项目路径设置成代码目录和配置文件目录
- hasura 的3factor 架构结论
- StreamSets 管理 SDC Edge上的pipeline
- IBM WebSphere MQ介绍安装以及配置服务详解(转)
- JUC线程池之 Callable和Future
- selenium启动谷歌所遇到的问题
- c# 模拟POST上传文件到服务器
- file_get_contents failed to open stream: HTTP request failed(一个字符决定成败)
- BASIC-30_蓝桥杯_阶乘计算