Cuda 学习教程:Cuda 程序初始化

CUDA_cudaFree_释放Stream_cudaError_t 错误类型码解释 官方网站 :CUDA Runtime API :: CUDA Toolkit Documentation 是 CUDA 中用于释放由 或 分配的设备内存的函数。它的参数是一个指向设备内存的指针,用于指示要释放的内存块的起始地址。用法说明如下:参数 是一个指向要释放的设备内存块的指针。这个指针必须是由 、 或类似函数返回的指针,指向通过 CUDA 运行时 API 分配的内存。如果 是 ,则 会忽略并返回 。通常情况下, 应该在不再需要设备内存时被调用,以释放之前通过 CUDA 运行时 API 分配的 阅读详情

Cuda程序初始化

目前,cuda里面没有对设备的初始化函数InitDevice(),只能每次调用的api函数的时候,加载设备的上下文,自动进行初始化,这将带来问题:


  • First函数调用的时候,需要自动初始化设备,因此耗时过长
  • 无法分析第一个api函数的耗时

处理办法

  • 在程序前加设置初始化函数: cudaFree(0),后面程序就不会再次初始化,cudamalloc()也将很快;
  • 一次初始化后,程序cudamalloc()分配的内存不释放,继续使用,所有程序运行结束后,再一起释放。

TestCode

简单的测试demo,例如:

@ Bytry Zhang
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <time.h>

#include<iostream>
#include <stdio.h>

using namespace std;

cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size);

__global__ void addKernel(int *c, const int *a, const int *b)
{
    int i = threadIdx.x;
    c[i] = a[i] + b[i];
}

int main()
{
    const int arraySize = 5;
    const int a[arraySize] = { 1, 2, 3, 4, 5 };
    const int b[arraySize] = { 10, 20, 30, 40, 50 };
    int c[arraySize] = { 0 };

    // Add vectors in parallel.
    cudaError_t cudaStatus = addWithCuda(c, a, b, arraySize);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "addWithCuda failed!");
        return 1;
    }

    printf("{1,2,3,4,5} + {10,20,30,40,50} = {%d,%d,%d,%d,%d}\n",
        c[0], c[1], c[2], c[3], c[4]);

    // cudaDeviceReset must be called before exiting in order for profiling and
    // tracing tools such as Nsight and Visual Profiler to show complete traces.
    cudaStatus = cudaDeviceReset();
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaDeviceReset failed!");
        return 1;
    }

    return 0;
}

// Helper function for using CUDA to add vectors in parallel.
cudaError_t addWithCuda(int *c, const int *a, const int *b, unsigned int size)
{
    int *dev_a = 0;
    int *dev_b = 0;
    int *dev_c = 0;
    cudaError_t cudaStatus;

    cudaStatus = cudaFree(0);
    //cudaStatus = cudaSetDevice(0);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaSetDevice failed!  Do you have a CUDA-capable GPU installed?");
        goto Error;
    }
    clock_t t = clock();

    // Choose which GPU to run on, change this on a multi-GPU system.


    // Allocate GPU buffers for three vectors (two input, one output)    .
    cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(int));
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMalloc failed!");
        goto Error;
    }

    cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(int));
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMalloc failed!");
        goto Error;
    }

    cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(int));
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMalloc failed!");
        goto Error;
    }

    cout << "cudaMemcpy time =  " << clock() - t << endl;

    // Copy input vectors from host memory to GPU buffers.
    cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(int), cudaMemcpyHostToDevice);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMemcpy failed!");
        goto Error;
    }

    cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(int), cudaMemcpyHostToDevice);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMemcpy failed!");
        goto Error;
    }

    // Launch a kernel on the GPU with one thread for each element.
    addKernel<<<1, size>>>(dev_c, dev_a, dev_b);

    // Check for any errors launching the kernel
    cudaStatus = cudaGetLastError();
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "addKernel launch failed: %s\n", cudaGetErrorString(cudaStatus));
        goto Error;
    }

    // cudaDeviceSynchronize waits for the kernel to finish, and returns
    // any errors encountered during the launch.
    cudaStatus = cudaDeviceSynchronize();
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaDeviceSynchronize returned error code %d after launching addKernel!\n", cudaStatus);
        goto Error;
    }

    // Copy output vector from GPU buffer to host memory.
    cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(int), cudaMemcpyDeviceToHost);
    if (cudaStatus != cudaSuccess) {
        fprintf(stderr, "cudaMemcpy failed!");
        goto Error;
    }


Error:
    cudaFree(dev_c);
    cudaFree(dev_a);
    cudaFree(dev_b);

    return cudaStatus;
}
中文领域最详细的Python版CUDA入门教程 本系列为英伟达GPU入门介绍的第二篇,主要介绍CUDA编程的基本流程和核心概念,并使用Python Numba编写GPU并行程序。为了更好地理解GPU的硬件架构,建议读者先阅读我的第一篇文章。 GPU硬件知识和基础概念:包括CPU与GPU的区别、GPU架构、CUDA软件栈简介。 GPU编程入门:主要介绍CUDA核函数,Thread、Block和Grid概念,并使用Python Numba进... 阅读详情

相关推荐

CUDA编程二(CUDA初始化)

CUDA初始化与核函数 CUDA初始化 CUDA安装成功之后,新建一个工程还是十分简单的,直接在新建项目的时候选择NVIDIA CUDA项目就可以了,我们先新建一个cuda工程,删掉自带的示例kernel.cu,然后新建项,新建一个CUDA C/C++ File ,我们首先看一下如何初始化CUDA,因此我命名为initcuda.cu 1.首先我们要使用CUDA的RunTime A

zy20150613的博客 1935

CUDA:cudaFree(0)

在学习代码的时候,遇到cudaFree(0),疑惑了一下,之前记得是释放显存,那么参数0是做什么操作?查阅资料并记录一下。 1:cudaFree函数API:接收void* devptr指针。释放指针指向的显存。如果输入参数时0,不会进行释放操作。 extern __host__ __cudart_builtin__ cudaError_t CUDARTAPI cudaFree(void *devPtr); 2:那cudaFree(0)的到底是干嘛的呢? 参考1:https://blog.c

微风❤水墨 5158

cuda数据初始化libtorch tensor

上述代码中,首先在主机内存中初始化了一个大小为$n \times m$的数据矩阵。方法,而不是普通的加法运算符。同样的,可以使用其他GPU计算支持的函数和方法来完成操作。通过将CPU内存中的数据指针和GPU显存中的数据指针传递给。函数将Tensor对象转换为主机内存中的数组,并打印结果。需要注意的是,在GPU端对数据进行计算和操作时,需要使用GPU上支持的。函数将GPU内存中的数据构造为Tensor对象,然后使用。函数,将数组从主机内存复制到GPU内存中。例如,在上面的例子中,使用的是。

爱CV 1656

CUDA学习入门(一)(包含CUDA安装和相关基础知识)

对CUDA入门做一个简单的概述性介绍,包括了CUDA安装教程。

weixin_44222088的博客 7835

CUDA基本入门教程

GPU并不是一个独立运行的计算平台,而需要与CPU协同工作,可以看成是CPU的协处理器,因此当我们在说GPU并行计算时,其实是指的基于CPU+GPU的异构计算架构。在异构计算架构中,GPU与CPU通过PCIe总线连接在一起来协同工作,CPU所在位置称为为主机端(host),而GPU所在位置称为设备端(device)

发狂的小花的博客 3430

[Bug已解决] CUDA error: initialization error CUDA 初始化失败解决方案

[Bug已解决] CUDA error: initialization error CUDA 初始化失败解决方案

一键难忘的博客 2432

CUDA编程入门极简教程

CUDA编程入门极简教程 转自:CUDA编程入门极简教程 作者:小小将 前言 2006年,NVIDIA公司发布了CUDA,CUDA是建立在NVIDIA的CPUs上的一个通用并行计算平台和编程模型,基于CUDA编程可以利用GPUs的并行计算引擎来更加高效地解决比较复杂的计算难题。近年来,GPU最成功的一个应用就是深度学习领域,基于GPU的并行计算已经成为训练深度学习模型的标配。目前,最新的CUDA版本为CUDA 9。 GPU并不是一个独立运行的计算平台,而需要与CPU协同工作,可以看成是CPU的协处理器,

weixin_44966641的博客 1万+

掌握CUDA编程:CUDA_Samples实战教程

CUDA(Compute Unified Device Architecture)是NVIDIA推出的并行计算平台和编程模型,它允许开发者利用GPU的计算能力解决复杂的科学计算问题。CUDA的出现极大地推动了通用并行计算的发展,为非图形计算领域提供了强大的计算加速。

weixin_30021053的博客 1252

深度学习部署笔记(四): CUDA 驱动API, 初始化CuInit

从几个简单的API开始学习CUDA

bobchen1017的博客 1911

cuda初始化代码 cuda初始化代码

cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码cuda初始化代码

CUDA开发示例Demo工程

CUDA(Compute Unified Device Architecture),是显卡厂商NVIDIA推出的运算平台。 CUDA是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 该资源主要由Introduction、Utilities、Concepts_and_Techniques、CUDA_Features、CUDA_Libraries等6个模块组成, 用于进行CUDA的使用示例演示。 开发者需提前安装CUDA和Cudnn(需结合电脑显卡情况), 然后使用Visual studio打开上述工程文件来进行编译和调试。 Visual studio版本需在2017以上。

【CUDA】认识CUDA

CUDA是并行计算的平台和类C编程模型,能很容易的实现并行算法。只需配备NVIDIA GPU,就可以在许多设备上运行并行程序。

GG_Bruse的博客 4379

恶意代码分析实战——使用Apatedns和Inetsim模拟网络环境

恶意代码分析实战——使用Apatedns和Inetsim模拟网络环境 注:本次实验主要是《恶意代码分析实战》一书中进入动态恶意代码分析篇章的开始,主要通过Apatedns以及Inetsim来模拟为恶意代码提供其需要的网络环境,本次实验以Lab01-03.exe为例。 一、实验环境及工具。 Vmware虚拟机:win10(win7)、kali 主要工具:Apatedns、Inetsim 二、工具的安装下载 1、Apatedns:需安装至windows虚拟机客户端(win10,win7均可) 下载地址:http

妙蛙种子吃了都会妙妙秒的妙脆角的博客 7934

2.2.cuda驱动API-初始化和检查的理解,CUDA错误检查习惯

2.2.cuda驱动API-初始化和检查的理解,CUDA错误检查习惯

周同学的博客 2471

基于ANSYS的电磁兼容仿真教程

最近,在做某系统的EMC仿真,使用ANSYS套件,对仿真学习做简要记录。本书简介与目录如下:本书配套有:视频教程+工程源文件+彩色仿真图片,下载链接如下:(审核中)第1章 基础知识1.1 电磁兼容基础​​​MS2、EMC三要素:3、 国际无线电干扰特别委员会标准:CISPR标准4、电磁兼容测试认证:传导发射(CE)、传导敏感度(CS)、辐射发射(RE)和辐射敏感度(RS)测试。

weixin_42508010的博客 2051

在游戏开发中如何使用Unity3D引擎开发麻将游戏

总体来说使用Unity3D引擎开发麻将游戏需要开发人员熟练掌握Unity3D的各种功能和API,并且需要深入了解麻将游戏的规则和背景,以便实现一个质量高、玩法丰富的游戏。在测试的过程中我们需要检查游戏是否符合规则,保证游戏逻辑的正确性,并检查游戏的UI是否和设计图一致,保证游戏的可玩性。Unity3D引擎是一个高度集成的游戏开发工具,可以为开发人员提供很多强大的工具和功能,包括3D建模、物理模拟、粒子系统、动画等等,在游戏开发中可以提高开发效率和游戏质量。在开始开发之前我们需要明确游戏的需求和功能。

a272857154的专栏 1889

CUDA编程(二) CUDA初始化与核函数

这次给大家介绍CUDA的初始化和如何在显卡上运行程序,即先将数据从内存复制到显存,再写好运算的核函数,之后用CUDA调用核函数,完成GPU上的计算,之后将结果复制回内存,释放掉显存的整个过程。

MingChao_Sun 2万+

【吃瓜教程】周志华西瓜书课后习题第一章答案

第一章 1.1表1.1中若只包含编号为1和4的两个样例,试给出相应的版本空间。 编号 色泽 根蒂 敲声 好瓜(标记) 1 青绿 蜷缩 浊响 是Y 4 乌黑 稍蜷 沉闷 否N 知识储备: 假设空间: 所有假设组成的空间 版本空间:与训练集一致的假设集合 从假设空间到版本空间算法大致如下: 1.删除与正例不一致的假设且删除与反例一致的假设 2.删除与正例不一致的假设 3.删除与反例一致的假设 具体选择哪种

MaxQuYY的博客 8370

多进程CUDA初始化的问题 Cannot re-initialize CUDA in forked subprocess

上面这个例子会报错,主进程触发了 CUDA 初始化,fork 出来的子进程中创建 tensor 的时候报错了。这句去掉,那么主进程就没有 CUDA 初始化的操作,子进程不会报错。,它们在底层机制、内存共享、安全性、兼容性等方面有根本差异。背景:在多实例算法服务的时候,出现了 cuda 初始化错误。时,选择错误的启动方法会导致程序崩溃或未定义行为。的,每个进程使用CUDA时,都会触发。父子进程之间有 cuda 状态的。的,没有问题,不会出现二次初始化。上面 fork 的示例中。

Michael是个半路程序员 1296

海思Hi3519A开发:DSP开发指南

通过创建DSP项目、实现算法、编译调试等步骤,开发者可以充分利用Hi3519A芯片集成的DSP,实现各种音视频处理功能。通过以上示例,我们可以看到在Hi3519A开发平台上进行DSP开发是一项强大而灵活的任务。在调试过程中,可以使用调试工具提供的功能,如断点设置、变量查看等,以便更好地理解和优化DSP算法的执行过程。在Hi3519A开发平台上,我们可以利用DSP的高性能计算能力来加速这些算法的执行。在实际的DSP开发中,算法的实现可能更加复杂,需要结合具体的项目需求进行。3.2 DSP算法实现。

QoTypescript的博客 1494

152:vue+leaflet 判断一个点是否在一个电子围栏内

本文介绍了一个基于Vue+Leaflet的示例,演示如何判断点是否在电子围栏内。作者大剑师兰特(优快云知名博主)展示了使用polygon.getBounds().contains(latlng)方法检测点与多边形边界的关系。代码仅需80行,通过点击地图触发判断逻辑,结果显示提示信息。该技术可广泛应用于地理围栏、位置服务等场景,需要安装turf依赖。文章提供了完整源码和配置说明,适合GIS开发者学习参考。

大剑师兰特的GIS世界 756

CUDA Lazy Loading:优化GPU程序初始化与内存使用的利器

CUDA Lazy Loading是一个完美的例子,展示了如何通过简单而优雅的设计改变来显著提升性能。它提醒我们,有时候最有效的优化不是添加更多功能,而是更智能地使用已有资源。在GPU编程的世界里,资源管理至关重要。通过Lazy Loading,NVIDIA为开发者提供了一个强大的工具,帮助我们构建更高效、更响应迅速的GPU应用程序。无论你是刚开始接触CUDA的新手,还是经验丰富的GPU编程专家,Lazy Loading都值得成为你优化工具箱中的一员。

专注于人工智能领域的小何尚 1721

手把手入门YOLO到改进优化教程专栏介绍与说明——列表目录查阅(持续更新)

手把手入门YOLO到改进优化教程专栏介绍与说明——列表目录查阅(持续更新)

嵌入式阿齐Archie 2万+

CUDA by Example 源码教程

CUDA by Example 源码教程 本教程旨在指导您如何探索并理解从 GitHub 获取的 CUDA by Example 源码,该项目包含了《CUDA By Example》一书中的示例代码。本教程将分为三个主要部分:项目目录结构及介绍、项目启动文件介绍、和项目配置文件介绍。 1. 项目目录结构及介绍 项目的根目录下组织了书籍中不同章节的示例代码,通常结构如下: CUDA-by-Examp...

gitblog_00082的博客 961

AttributeError: module ‘lib‘ has no attribute ‘X509_V_FLAG_CB_ISSUER_CHECK‘解决方案

本文主要介绍了AttributeError: module ‘lib’ has no attribute 'X509_V_FLAG_CB_ISSUER_CHECK’解决方案,希望能对使用python的同学们有所帮助。 文章目录 1. 问题描述 2. 解决方案

weixin_43178406的博客 5万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

上一篇: C++模板
下一篇: C++ 多态
Walker Zhang
博客等级 码龄14年 144粉丝 60原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值