cuda runtime-hellocuda

文章介绍了CUDARuntimeAPI如何简化CUDA设备和上下文的管理,通过cudaSetDevice函数自动处理CUcontext,实现懒加载模式,避免了显式的驱动初始化和销毁操作。示例代码展示了在无初始context的情况下,如何通过调用API设置当前设备并获取context。
摘要由CSDN通过智能技术生成

cuda runtime是以cuda为基准开发的运行时库cuda runtime所使用的CUcontext是基于cuDevicePrimaryCtxRetain函数获取的即,cuDevicePrimaryCtxRetain会为每个设备关联一个context,通过cuDevicePrimaryCtxRetain函数可以获取到而context初始化的时机是懒加载模式,即当你调用一个runtime api时,会触发创建动作也因此,避免了cu驱动级别的init和destroy操作。使得api的调用更加容易。

实例代码如下:

// cuda驱动头文件
#include <cuda.h>
// cuda runtime 头文件
#include <cuda_runtime.h>
#include <stdio.h>
#include <string.h>

#define checkRuntime(op) __check_cuda_runtime((op), #op, __FILE__, __LINE__)

bool __check_cuda_runtime(cudaError_t code, const char *op, const char *file, int line)
{

    if (code != cudaSuccess)
    {
        const char *err_name = cudaGetErrorName(code);
        const char *err_message = cudaGetErrorString(code);

        printf("%s:%d  %s failed. \n  code = %s, message = %s\n", file, line, op, err_name, err_message);
        return false;
    }
    return true;
}

int main()
{
    CUcontext context = nullptr;
    cuCtxGetCurrent(&context);
    printf("Current context = %p, 当前无context\n", context);

    int device_count = 0;
    checkRuntime(cudaGetDeviceCount(&device_count));
    printf("device_count = %d\n", device_count);

    // 取而代之,是使用setdevice来控制当前上下文,当你要使用不同设备时
    // 使用不同的device id
    // 注意,context是线程内作用的,其他线程不相关的, 一个线程一个context stack
    int device_id = 0;
    printf("set current device to : %d,这个API依赖CUcontext,触发创建并设置\n", device_id);
    checkRuntime(cudaSetDevice(device_id));

    // 注意,是由于set device函数是“第一个执行的需要context的函数”,所以他会执行cuDevicePrimaryCtxRetain
    // 并设置当前context,这一切都是默认执行的。注意:cudaGetDeviceCount是一个不需要context的函数
    // 你可以认为绝大部分runtime api都是需要context的,所以第一个执行的cuda runtime函数,会创建context并设置上下文
    cuCtxGetCurrent(&context);
    printf("SetDevice after, Current context = %p,获取当前context\n", context);

    int current_device = 0;
    checkRuntime(cudaGetDevice(&current_device));
    printf("current_device = %d\n", current_device);
}

上述代码展示了使用 CUDA Runtime API 进行 device 和 context 的管理操作。通过调用相应的 API (cudaSetDevice函数),设置当前设备并自动获取当前上下文等操作,而无需手动进行驱动初始化和销毁等操作。可见使用 CUDA Runtime API 更加方便和易于操作。
运行结果如下:

Current context = (nil), 当前无context
device_count = 1
set current device to : 0,这个API依赖CUcontext,触发创建并设置
SetDevice after, Current context = 0x5562f37c2420,获取当前context
current_device = 0

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Attention is all you

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值