问题标签 [cuda-driver]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
556 浏览

linux - 缺少符号:cuDevicePrimaryCtxRelease 与 cuDevicePrimaryCtxRelease_v2

我正在尝试构建以下程序:

编译总是很顺利;但是,使用 CUDA 10.2,链接工作,而使用 CUDA 11.2,我得到:

为什么会发生这种情况,我该如何解决?

注意:我正在使用带有驱动程序版本 440.82 的 Devuan Beowulf(尚未为 CUDA 11.2 安装新驱动程序)。

0 投票
1 回答
117 浏览

cuda - CUDA JIT 编译器是否执行设备链接时优化?

在 CUDA 11.2 中引入设备链接时优化 (DLTO) 之前,确保前向兼容性相对容易,而无需过多担心性能差异。您通常只需为您通常针对的特定架构创建一个包含 PTX 的胖二进制文件,用于可能的最低架构和 SASS。对于任何未来的 GPU 架构,JIT 编译器随后会将 PTX 组装到针对特定 GPU 架构优化的 SASS 中。

然而,现在,对于 DLTO,我不太清楚如何确保前向兼容性并保持这些未来架构的性能。

假设我使用nvcc以下选项编译/链接应用程序:

编译

关联

这将创建一个包含 PTX 的胖二进制文件cc_52,LTO 中介用于sm_52sm_61,以及链接时间优化的 SASSsm_52sm_61(或者至少在使用cuobjdump -all无论如何转储生成的 fatbin 部分时似乎是这种情况)。

假设以上是正确的,当应用程序运行在更高版本的 GPU 架构(例如sm_70)上时会发生什么?JIT 编译器是否只是在cc_52不使用链接时优化的情况下组装 PTX(导致不太优化的代码)?或者它是否使用链接时间优化以某种方式链接 LTO 中介?有没有办法确定/指导 JIT 编译器在做什么?

0 投票
2 回答
39 浏览

cuda - 为什么我的二维数组复制参数被驱动 API 拒绝?

我正在尝试使用 CUDA 驱动程序 API 将数据复制到 2D 数组中,在下面列出的程序中,但是当我传递我的复制参数时出现“无效值”错误。它们的什么价值是错误的?

该程序的完整输出:

附加信息:

  • CUDA 工具包版本:11.4
  • NVIDIA驱动版本:470.57.02
  • 操作系统发行版:Devuan Chimaera GNU/Linux
  • GPU:GeForce 1050 TI Boost(计算能力 6.1)
  • 主机架构:amd64
0 投票
1 回答
27 浏览

cuda - 这些 CUDA 指针属性的类型是什么?

传递一个指向多种类型之一的cuGetPointerAttribute()指针,根据请求的实际属性填充。其中一些类型是明确说明的,或者可以隐含地推导出来推导,但有些类型 - 不是那么多。具体来说......必须为属性传递指针的类型是什么:

  • CU_POINTER_ATTRIBUTE_BUFFER_ID- 可能是数字 ID,但它的类型是什么?
  • CU_POINTER_ATTRIBUTE_ALLOWED_HANDLE_TYPES- 一个位掩码,据说,但有多宽?

CUDA 驱动程序 API 似乎没有回答这些问题。

int*PS - 即使对于布尔属性,您是否应该通过 an或 a也不够清楚bool*

0 投票
1 回答
44 浏览

cuda - CUDA Runtime 的当前设备和驱动上下文栈如何交互?

CUDA 运行时有一个“当前设备”的概念,而 CUDA 驱动程序没有。相反,驱动程序有一个上下文堆栈,其中“当前上下文”位于堆栈的顶部。

两者如何互动?即 Driver API 调用如何影响 Runtime API 的当前设备,改变当前设备如何影响 Driver API 的上下文堆栈或其他状态?

有点相关的问题:如何将 cuda 驱动程序 api 与 cuda 运行时 api 混合?

0 投票
1 回答
74 浏览

cuda - 如何获取已编译程序中函数和全局变量的 CUDA 驱动程序模块句柄?

CUDA 运行时 API具有用于从主机端代码处理设备端全局变量的功能cudaGetSymbolAddress(),使用它们的名称(源代码标识符)作为句柄。cudaGetSymbolSize()

在驱动程序 API 中,我们有cuModuleGetGlobal(),它可以让我们做同样的事情......除了它需要一个全局符号所在的 CUmodule。如果您正在使用动态编译并加载/添加到模块中的代码那么你就准备好了。但是,如果这些全局变量是您程序的一部分,使用 NVCC 静态编译而不是动态加载呢?

我会假设每个编译的程序都有某种“主模块”或“默认模块”,其中包含内置的全局变量和函数。我能得到它的句柄吗?

0 投票
1 回答
47 浏览

cuda - 如何获取_actual_ CUDA 驱动程序版本?

如何以编程方式获取实际的 CUDA 驱动程序版本(例如 470.57.02,而不是 11.4,如相应的 CUDA 版本或 11040)?我们知道这不是 cudaDriverGetVersion()...

0 投票
1 回答
150 浏览

cuda - 如何将选项 CU_JIT_LTO 与 CUDA JIT 链接一起使用?

我想知道是否可以使用选项 CU_JIT_LTO 在即时 (JIT) 链接期间改进链接时间优化 (LTO)。如果是这样,我该如何指定这个选项?

我在 NVIDIA 开发者博客中找到了以下代码,但我不明白为什么将 walltime 赋予 CU_JIT_LTO。博客中没有定义 walltime 变量。当我尝试类似的事情时,它对我的​​内核性能没有影响。

来源:https ://developer.nvidia.com/blog/discovering-new-features-in-cuda-11-4/

我的示例案例使用输入选项CU_JIT_INPUT_NVVM来链接使用 LTO 标志(-dlto-code=lto_80)创建的对象。似乎链接器已经做了一些 LTO,因为内核“执行得更好”,而不是链接没有 LTO 的目标文件,但不如使用 NVCC 链接 LTO。(有关详细结果和讨论,请参见示例案例)

示例案例

为了检查链接时间优化 (LTO) 的有效性,我使用 4 种不同的方法创建了一个简单的程序,并使用每个线程的寄存器数量作为指标。这在我的系统上给出了以下结果(操作系统:ubuntu 20.04,CUDA 工具包:11.5.1,NVIDIA 驱动程序:495.44,GPU:NVIDIA RTX 3080)。

结果解读:

从单个翻译文件创建程序应该可以得到最好的结果。编译器可以看到所有的函数实现并使用它来优化内核。这导致 30 个寄存器/线程。

使用 NVCC 与 LTO 链接绝对有效。它使用与从单个 .cu 文件编译的程序相同数量的寄存器 (30),而没有 LTO 的情况则不同(使用 44 个寄存器)。

使用 NVRTC/JIT 链接文件比在没有 LTO 的情况下链接 NVCC 做得“更好”(当我们只关注寄存器使用时),但不如使用 LTO 链接 NVCC。内核使用 38 个寄存器/线程。

注意:我的目标不是减少寄存器的使用,我只是把它作为一个指标。因为来自单个翻译文件的程序使用 30 个寄存器/线程,所以我假设一个完全优化的链接程序将具有相同的“最终可执行代码”,因此使用相同数量的寄存器。因为情况并非如此,所以我开始研究 JIT 选项。

CU_JIT_LTO 选项:

我尝试使用 JIT_option CU_JIT_LTO 进一步优化 NVRTC/JIT 案例中的链接。但是,我不确定如何使用此选项。我尝试了以下两种方式(有关更多上下文,请参见下面的文件cuda 代码。链接代码从第 41 行开始):

方法 1:将选项 CU_JIT_LTO 添加到cuLinkCreate(...). 这似乎没有任何效果。int lto = 0该代码在和时使用相同数量的寄存器int lto = 1

方法 2:将选项 CU_JIT_LTO 添加到cuLinkAddFile(...)cuLinkAddData(...)。这会立即给出错误 CUDA_ERROR_INVALID_VALUE。

所以现在我的问题是:应该如何使用选项 CU_JIT_LTO?

文件:

下面是两个文件。按照以下步骤运行示例(在 linux 操作系统上):

  1. 将 cuda 代码保存在扩展名为 .cu 的文件中(例如:code.cu)
  2. 将 bash 脚本保存在文件中(例如:run.sh)
  3. 从终端运行此命令:bash run.sh code.cu

cuda代码:

bash脚本:

子问题:生成 NVVM IR 文件

要生成func_link_nvrtc_lto.o与命令一起使用的文件cuLinkAddFile(linker, CU_JIT_INPUT_NVVM, "func_link_nvrtc_lto.o", ...),我必须添加-ptx标志,如下面的命令所示。我没有在任何文档中找到这一点,而是通过尝试和错误。我想知道是否有更好的方法来生成这样的文件。

0 投票
0 回答
5 浏览

virtual-memory - 为什么 cuMemAddressReserve 带一个 out 参数?

接受调用者想要保留的cuMemAddressReserve()地址范围 ( addr, )。size奇怪的是,它还需要一个CUdeviceptr* ptr参数,它放置的位置......的值addr据说

参数

ptr 指向分配的虚拟地址范围开始的结果指针
大小 保留的虚拟地址范围的大小请求
对齐保留的虚拟地址范围 的对齐请求
addr 固定的起始地址范围请求的
标志 当前未使用,必须为零

这是为什么?它有时可以赋予不同的价值*ptr吗?

0 投票
0 回答
13 浏览

multi-gpu - 如何在上下文之间复制 2D CUDA 数组/纹理?

假设我想在不同的 CUDA 上下文(可能在不同的设备上)之间复制一些内存。CUDA 驱动程序 API为我提供

  • cuMemcpyPeer- 对于普通旧设备全局内存
  • cuMemcpy3DPeer- 用于 3D 阵列/纹理

但是二维数组似乎没有类似的 API 函数。为什么?还有——我该怎么办?我应该在两种情况下都通过普通的全局内存缓冲区吗?

PS - 异步副本的问题相同;我们涵盖了普通和 3D 案例,但没有 2D。