流关联示例:
将数据与流关联可以对CPU + GPU并发性进行细粒度的控制,但是在使用低于6.x的计算能力的设备时,必须记住哪些数据是可见的。 查看较早的同步示例:

__device__ __managed__ int x, y = 2;
__global__ void kernel() {x = 10;
}
int main() {cudaStream_t stream1;cudaStreamCreate(&stream1);cudaStreamAttachMemAsync(stream1, &y, 0, cudaMemAttachHost);cudaDeviceSynchronize(); // Wait for Host attachment to occur.kernel << < 1, 1, 0, stream1 >> >(); // Note: Launches into stream1.y = 20; // Success – a kernel is running but “y”// has been associated with no stream.return 0;
}

在这里,我们明确地将y与主机可访问性相关联,从而使CPU始终能够访问。 (如前所述,请注意在访问之前没有cudaDeviceSynchronize()。)运行内核的GPU访问y现在会产生未定义的结果。
请注意,将变量与流关联不会更改任何其他变量的关联。 例如。 将x关联到stream1并不能确保只有x被stream1中启动的内核访问,因此错误是由以下代码引起的:

__device__ __managed__ int x, y = 2;
__global__ void kernel() {x = 10;
}
int main() {cudaStream_t stream1;cudaStreamCreate(&stream1);cudaStreamAttachMemAsync(stream1, &x);// Associate “x” with stream1.cudaDeviceSynchronize(); // Wait for “x” attachment to occur.kernel << < 1, 1, 0, stream1 >> >(); // Note: Launches into stream1.y = 20; // ERROR: “y” is still associatedglobally// with all streams by defaultreturn 0;
}

请注意,对y的访问将导致错误,因为尽管x已经与流相关联,但我们已经告诉系统没有人可以看到y。 因此,系统保守地认为内核可能会访问它并阻止CPU这样做。
流连接与多线程主机程序:
cudaStreamAttachMemAsync()的主要用途是使用CPU线程启用独立任务并行。 通常在这样的程序中,CPU线程为其生成的所有工作创建自己的流,因为使用CUDA的NULL流将导致线程之间的依赖关系。
受管理数据对任何GPU流的默认全局可见性可能会使得难以避免多线程程序中的CPU线程之间的交互。 函数cudaStreamAttachMemAsync()因此用于将线程的托管分配与该线程自己的流相关联,并且该关联在线程的整个生命周期中通常不会更改。
这样的程序只需将一个调用添加到cudaStreamAttachMemAsync()中即可为其数据访问使用统一内存:

// This function performs some task, in its own private stream.
void run_task(int *in, int *out, int length) {// Create a stream for us to use.cudaStream_t stream;cudaStreamCreate(&stream);// Allocate some managed data and associate with our stream.// Note the use of the host-attach flag to cudaMallocManaged();// we then associate the allocation with our stream so that// our GPU kernel launches can access it.int *data;cudaMallocManaged((void **)&data, length, cudaMemAttachHost);cudaStreamAttachMemAsync(stream, data);cudaStreamSynchronize(stream);// Iterate on the data in some way, using both Host & Device.for (int i = 0; i<N; i++) {transform << < 100, 256, 0, stream >> >(in, data, length);cudaStreamSynchronize(stream);host_process(data, length); // CPU uses managed data.convert << < 100, 256, 0, stream >> >(out, data, length);}cudaStreamSynchronize(stream);cudaStreamDestroy(stream);cudaFree(data);
}

在这个例子中,分配流关联只建立一次,然后数据被主机和设备重复使用。 结果是比在主机和设备之间明确复制数据时更简单的代码,尽管结果是相同的。

CUDA学习(九十八)相关推荐

  1. 九十八、轻松搞定Python中的Markdown系列

    @Author:Runsen @Date:2020/7/15 人生最重要的不是所站的位置,而是内心所朝的方向.只要我在每篇博文中写得自己体会,修炼身心:在每天的不断重复学习中,耐住寂寞,练就真功,不畏 ...

  2. CUDA学习:GPU硬件连接模型

    CUDA学习:GPU硬件连接模型 一.基本的CPU与GPU连接模型 CPU与GPU之间的连接是通过PCI-Express总线进行连接的.GPU不是一个独立运行的平台而是CPU的协处理器.因此,GPU必 ...

  3. 推荐系统遇上深度学习(九十二)-[腾讯]RecSys2020最佳长论文-多任务学习模型PLE

    今天介绍的是腾讯提出的一种新的多任务学习个性化推荐模型,该论文荣获了RecSys2020最佳长论文奖,一起来学习下! 1.背景 多任务学习通过在一个模型中同时学习多个不同的目标,如CTR和CVR,最近 ...

  4. 《Two Dozen Short Lessons in Haskell》学习(八)- Function Types, Classes, and Polymorphism

    <Two Dozen Short Lessons in Haskell>(Copyright © 1995, 1996, 1997 by Rex Page,有人翻译为Haskell二十四学 ...

  5. Maven学习总结(八)——使用Maven构建多模块项目

    2019独角兽企业重金招聘Python工程师标准>>> Maven学习总结(八)--使用Maven构建多模块项目 在平时的Javaweb项目开发中为了便于后期的维护,我们一般会进行分 ...

  6. 学习Kotlin(八)其他技术

    推荐阅读: 学习Kotlin(一)为什么使用Kotlin 学习Kotlin(二)基本语法 学习Kotlin(三)类和接口 学习Kotlin(四)对象与泛型 学习Kotlin(五)函数与Lambda表达 ...

  7. 从零开始学习jQuery (八) 插播:jQuery实施方案

    本系列文章导航 从零开始学习jQuery (一) 开天辟地入门篇 从零开始学习jQuery (二) 万能的选择器 从零开始学习jQuery (三) 管理jQuery包装集 从零开始学习jQuery ( ...

  8. CUDA学习----sp, sm, thread, block, grid, warp概念

    CUDA学习----sp, sm, thread, block, grid, warp概念 2017-01-11 17:14:28|  分类: HPC&CUDA优化 |  标签:cuda  g ...

  9. CUDA学习笔记之 CUDA存储器模型

    CUDA学习笔记之 CUDA存储器模型 标签: cuda存储bindingcache编程api 2010-12-14 01:33 1223人阅读 评论(0) 收藏 举报 分类: CUDA(26) GP ...

  10. CUDA学习笔记之程序优化

    CUDA学习笔记之程序优化 标签: cuda优化conflict存储算法数学计算 2010-01-05 17:18 5035人阅读 评论(4) 收藏 举报 分类: CUDA(6) 版权声明:本文为博主 ...

最新文章

  1. R语言使用WVPlots包可视化收入与年龄的Hexbin图并叠加平滑曲线实战
  2. python 游戏 —— 汉诺塔(Hanoita)
  3. mysql(1):查找语句练习
  4. 操作文件 -------JavaScrip
  5. IAR for AVR delay函数
  6. linux设备数内核选项,linux内核设备树修改指南 / linux kernel device tree modify guide
  7. 联想笔记本怎么进入pe系统_lenovo怎么进入pe系统
  8. [OpenCV+VS2015]火焰检测算法(HSI判据)
  9. ant design + react带有二级导航菜单自动生成
  10. 报告显示,宝爸参与度不断提升,超三成男性提前服用营养品备孕
  11. 牛客:爬塔(STL)
  12. Win11十二月系统更新了什么内容?
  13. NMock学习系列(三)--- NMock在DDD领域驱动的单元测试中的应用
  14. 计算机课程微信可以教吗,这样操作都可以?教你用微信远程控制电脑!
  15. mmo游戏服务器性能指标,关于performance:厚积薄发MMORPG手游合理的性能参数
  16. 计算:光速运行一年的长度是多少米?(测试整数运算溢出)
  17. 基于LM2576的降压电源的分析与设计
  18. 基于jsp+mysql+ssm大学校园宿舍零食便利店-计算机毕业设计
  19. 线索化二叉树及其遍历
  20. MessageQueueMessage Pool—消息的读写、删除和回收

热门文章

  1. 七彩影视双端新版本源码
  2. 电子商务企业整站模板
  3. 【字节网盘】emlog版收录导航主题模板
  4. 基于特征的对抗迁移学习论文_[论文笔记] 对抗样本不是bugs,而是特征
  5. 叮咚酒店营销版小程序v8.5.8+前端
  6. discuz集思街淘宝客模板
  7. The7主题-汉化绿色版/免key导入demo/安装插件[更至v9.10.1]
  8. [译]后台执行UNIX/Linux命令和脚本的五种方法
  9. 剑指offer 09.用两个栈实现队列
  10. Elasticsearch整理笔记(五)