▶ 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

OpenACC 简单的原子操作的更多相关文章

  1. OpenACC 简单的直方图

    ▶ 简单的直方图,强调原子操作的使用 ● 代码 #include <stdio.h> #include <stdlib.h> #include <openacc.h> ...

  2. 对 cloudwu 简单的 cstring 进行简单解析

    题外话 以前也用C写过字符串,主要应用的领域是,大字符串,文件读取方面.写的很粗暴,用的凑合着.那时候看见云风前辈的一个开源的 cstring 串. 当时简单观摩了一下,觉得挺好的.也没细看.过了较长 ...

  3. zookeeper源码分析之一服务端启动过程

    zookeeper简介 zookeeper是为分布式应用提供分布式协作服务的开源软件.它提供了一组简单的原子操作,分布式应用可以基于这些原子操作来实现更高层次的同步服务,配置维护,组管理和命名.zoo ...

  4. 第二章 管理程序流(In .net4.5) 之 管理多线程

    1. 概述 本章包括同步资源以及取消长时间任务相关的内容. 2. 主要内容 2.1 同步资源 ① lock关键字实现.会阻塞程序,有可能会导致死锁. ② volatile关键字可以禁用编译优化,用于避 ...

  5. C 实现一个跨平台的定时器 论述

    引言 今天我们要讲述和构建的是一个跨平台多线程C的定时器对象,粒度是毫秒级别.可以称之为简易的timer, sctimer.h 库. 首先看总的接口,看门见客. sctimer.h #ifndef _ ...

  6. 对云风 cstring 第二次解析

    前言 从明天起 关心粮食和蔬菜 我有一所房子 面朝大海 春暖花开 本文前提条件 1.了解 posix 线程 2.了解 原子操作 3.具备简单C基础,或者 你也敲一遍. 如果上面不太清楚,你可以翻看我以 ...

  7. 论文笔记(8):BING: Binarized Normed Gradients for Objectness Estimation at 300fps

    译文: <基于二值化赋范梯度特征的一般对象估计> 摘要: 通过训练通用的对象估计方法来产生一组候选对象窗口,能够加速传统的滑动窗口对象检测方法.我们观察到一般对象都会有定义完好的封闭轮廓, ...

  8. java基础系列--volatile关键字

    原创作品,可以转载,但是请标注出处地址:http://www.cnblogs.com/V1haoge/p/7833881.html 1.volatile简述 据说,volatile是java语言中最轻 ...

  9. Linux内核同步

    Linux内核剖析 之 内核同步 主要内容 1.内核请求何时以交错(interleave)的方式执行以及交错程度如何. 2.内核所实现的基本同步机制. 3.通常情况下如何使用内核提供的同步机制. 内核 ...

随机推荐

  1. with() {} 的用法

    var use = "other"; var katana = { isSharp: true, use: function(){ this.isSharp = !!this.is ...

  2. 51Nod:1995 三子棋

    1995 三子棋  题目来源: syu校赛 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 小的时候大家一定玩过"井"字棋吧.也就是在 ...

  3. (2)字符编码关系和转换(bytes类型)

    ASCII 占一个字节,只支持英文 GB2312 占2个字节,只支持6700+汉字 GBK 是GB2312的升级版,支持21000+汉字 Shift-JIS 日本字符编码 ks_c-5601-1987 ...

  4. Python & 机器学习入门指导

    Getting started with Python & Machine Learning(阅者注:这是一篇关于机器学习的指导入门,作者大致描述了用Python来开始机器学习的优劣,以及如果 ...

  5. 保存csv时, 不保留index

    pd.to_csv('your.csv', index=False)

  6. STS或eclipse安装SVN插件(转)

    安装sts--SVN插件 简介:sts是与eclipse类似的Java IDE开发工具(不了解的百度) 1.sts菜单栏 help->install New Software 依据大家的版本选择 ...

  7. WPF中Image显示本地图片(转)

    private void SetSource(System.Windows.Controls.Image image, string fileName) { System.Drawing.Image ...

  8. vulcanjs 简单package 编写

    vulcanjs 功能是以包进行管理,包里面包含了运行依赖的组件以及对于路由的注册 参考项目 项目结构 ├── README.md ├── license.md ├── package-lock.js ...

  9. ubuntu16安装及嵌入式开发环境搭建

    1.Ubuntu虚拟机新建好要安装vmware tools才能共享文件夹,解压安装tar zxf VMwareTools-10.0.10-4301679.tar.gz ,回车键,解压该文件. 解压完毕 ...

  10. [C++] Win32 API 的多线程Timer管理Trick - 利用PostThreadMessage

    有时候我们需要在程序里定时地完成一些任务, 比如5秒后发送, 10秒后弹窗之类的操作. 这就需要一个类似于定时器的组件. 这个组件在windows.h里被称为Timer. 设置一个Timer 第一步当 ...