CUDA学习(十六)

简介:

统一的虚拟地址空间:
当应用程序以64位进程运行时,单个地址空间用于主机以及计算能力2.0及更高版本的所有设备。 所有通过CUDA API调用进行的主机内存分配以及受支持设备上的所有设备内存分配均在此虚拟地址范围内。 作为结果:

  • 可以使用cudaPointerGetAttributes()从指针的值中确定通过CUDA分配的主机上的任何内存或使用统一地址空间的任何设备上的内存位置。
  • 在使用统一地址空间的任何设备的内存中进行复制或复制时,可以将cudaMemcpy *()的cudaMemcpyKind参数设置为cudaMemcpyDefault,以确定指针的位置。 这也适用于未通过CUDA分配的主机指针,只要当前设备使用统一寻址。
  • 通过cudaHostAlloc()的分配在所有使用统一地址空间的设备上是自动可移植的,并且由cudaHostAlloc()返回的指针可以直接从在这些设备上运行的内核中使用(即,不存在 需要通过cudaHostGetDevicePointer()获取设备指针,如Mapped Memory中所述

应用程序可以通过检查unifiedAddressing设备属性(请参阅设备枚举)是否等于1来查询统一地址空间是否用于特定设备。
进程间通信:
由主机线程创建的任何设备内存指针或事件句柄都可以被同一进程内的任何其他线程直接引用。 然而,在这个过程之外它是无效的,因此不能被属于不同进程的线程直接引用。
要跨进程共享设备内存指针和事件,应用程序必须使用参考手册中详细描述的进程间通信API。 IPC API仅支持Linux上的64位进程以及计算能力为2.0或更高的设备。
使用这个API,应用程序可以使用cudaIpcGetMemHandle()来获得给定设备内存指针的IPC句柄,并使用标准IPC机制(例如进程间共享内存或文件)将其传递给另一个进程,并使用cudaIpcOpenMemHandle()来检索设备 来自IPC句柄的指针,这是另一个进程中有效的指针。 事件句柄可以使用类似的入口点共享。
使用IPC API的一个例子是单个主进程生成一批输入数据,使数据可用于多个从进程而无需再生或复制。
错误检查:
所有运行时函数都会返回一个错误代码,但对于异步函数(请参见异步并发执行),此错误代码不可能报告设备上可能发生的任何异步错误,因为该函数在设备完成任务之前返回; 错误代码仅报告执行任务之前在主机上发生的错误,通常与参数验证有关; 如果发生异步错误,则会由一些后续不相关的运行时函数调用报告。
因此,在调用一个异步函数之后检查异步错误的唯一方法就是在调用之后通过调用cudaDeviceSynchronize()(或者使用异步并发执行中描述的任何其他同步机制)同步并检查由cudaDeviceSynchronize返回的错误代码()
运行时为每个主机线程维护一个错误变量,该主机线程被初始化为cudaSuccess,并且每次发生错误时都会被错误代码覆盖(不管是参数验证错误还是异步错误)。 cudaPeekAtLastError()返回这个变量。 cudaGetLastError()返回这个变量并将其重置为cudaSuccess。
内核启动不返回任何错误代码,所以cudaPeekAtLastError()或
必须在内核启动后调用cudaGetLastError()才能检索任何启动前错误。 为了确保由cudaPeekAtLastError()或cudaGetLastError()返回的任何错误不是来自内核启动之前的调用,必须确保运行时错误变量在内核启动之前设置为cudaSuccess,例如通过调用 内核启动之前的cudaGetLastError()。 内核启动是异步的,因此为了检查异步错误,应用程序必须在内核启动和对cudaPeekAtLastError()或cudaGetLastError()的调用之间进行同步。
请注意,可能由cudaStreamQuery()和cudaEventQuery()返回的cudaErrorNotReady不被视为错误,因此不会被cudaPeekAtLastError()或cudaGetLastError()报告。
调用堆栈:
在计算能力为2.x或更高的设备上,可以使用cudaDeviceGetLimit()查询调用堆栈的大小,并使用cudaDeviceSetLimit()
当调用堆栈溢出时,如果应用程序通过CUDA调试器(cuda-gdb,Nsight)或未指定的启动错误运行,那么内核调用会失败并出现堆栈溢出错误。
v2_50e7e72b0f5f3510c77c3139c1a3562c_hd

目录
相关文章
|
安全 Linux 网络安全
VS Code通过跳板机连接服务器进行远程代码开发
VS Code通过跳板机连接服务器进行远程代码开发
3969 0
VS Code通过跳板机连接服务器进行远程代码开发
|
12月前
|
缓存 物联网 PyTorch
使用TensorRT LLM构建和运行Qwen模型
本文档介绍如何在单GPU和单节点多GPU上使用TensorRT LLM构建和运行Qwen模型,涵盖模型转换、引擎构建、量化推理及LoRA微调等操作,并提供详细的代码示例与支持矩阵。
2912 2
|
存储 SQL 前端开发
跟老卫学HarmonyOS开发:ArkTS关系型数据库开发
本节以“账本”为例,使用关系型数据库接口实现账单的增、删、改、查操作。通过创建ArkTSRdb应用,演示如何操作RdbStore进行数据管理,并结合界面按钮实现交互功能。
692 0
跟老卫学HarmonyOS开发:ArkTS关系型数据库开发
|
Web App开发 前端开发 JavaScript
手摸手教你,从0到1开发一个Chrome浏览器插件
开发 Chrome 插件既有趣又具成就感。本教程将引导你从零开始,逐步创建一个简单的 Chrome 插件。首先了解 Chrome 插件是可增强浏览器功能的小程序。以一个基础示例开始,你将学习如何设置开发环境,包括安装 Chrome 和准备文本编辑器,并掌握 HTML、CSS 和 JavaScript 的基础知识。接着,我们将构建插件的基本结构,涉及 `manifest.json` 配置文件、`background.js` 后台脚本、`popup.html` 用户界面以及 `style.css` 样式表。
1744 8
|
人工智能 搜索推荐 Android开发
移动应用与系统:探索开发趋势与操作系统演进####
本文深入剖析了移动应用开发的最新趋势与移动操作系统的演进历程,揭示了技术创新如何不断推动移动互联网生态的变革。通过对比分析不同操作系统的特性及其对应用开发的影响,本文旨在为开发者提供洞察未来技术方向的视角,同时探讨在多样化操作系统环境中实现高效开发的策略。 ####
274 0
|
存储 安全 网络安全
网络安全之强密码策略
【8月更文挑战第12天】
1142 1
|
小程序
uni-app开发微信小程序使用onPullDownRefresh(下拉刷新)总结
uni-app开发微信小程序使用onPullDownRefresh(下拉刷新)总结
2896 0
|
Rust Shell 索引
使用阿里云镜像加速Rust与Cargo安装及更新
使用阿里云镜像加速Rust与Cargo安装及更新
15646 2
|
设计模式 算法 编译器
【C++ 泛型编程 入门篇】C++ 元编程 :模板结构体的的使用教程
【C++ 泛型编程 入门篇】C++ 元编程 :模板结构体的的使用教程
1076 1

热门文章

最新文章