cuda3 管理内存 代码解析额

news2025/1/11 4:27:37

内存管理

在这里插入图片描述
在这里插入图片描述
全局内存数据主要存放的地方
共享内存块内数据同步的地方
在这里插入图片描述

在这里插入图片描述
返回一个标记符 是否成功

在这里插入图片描述
比普通Malloc快一倍

统一内存分配释放

在这里插入图片描述
少了传输过程

同步拷贝

在这里插入图片描述
必须等拷贝完才会执行下面的

异步

在这里插入图片描述
注意拷贝是否完成,如果直接使用,并不知道拷贝是否完成

共享内存

主要是在程序块中定义
编译的时候就确定了,大小无法改变,程序写死了

内存空间相对较小
在这里插入图片描述
在这里插入图片描述
两种使用共享内存的方式

一种是在编译的时候知道的
另一种是在启动的时候知道的

内存使用代码解析

在这里插入图片描述


#include <stdio.h>
#include <cuda.h>

typedef double FLOAT;

__global__ void sum(FLOAT *x)
{
    int tid = threadIdx.x;

    x[tid] += 1; 定义核函数 ,找到索引,给他向量加1
}

int main()
{
    int N = 32;
    int nbytes = N * sizeof(FLOAT);

    FLOAT *dx = NULL, *hx = NULL;
    int i;

    /* allocate GPU mem */
    cudaMalloc((void **)&dx, nbytes);

    if (dx == NULL) {
        printf("couldn't allocate GPU memory\n");
        return -1;
    }

    /* alllocate CPU host mem: memory copy is faster than malloc */
    hx = (FLOAT *)malloc(nbytes);

    if (hx == NULL) {
        printf("couldn't allocate CPU memory\n");
        return -2;
    }

    /* init */
    printf("hx original: \n");
    for (i = 0; i < N; i++) {
        hx[i] = i;

        printf("%g\n", hx[i]);
    }

    /* copy data to GPU */
    cudaMemcpy(dx, hx, nbytes, cudaMemcpyHostToDevice);

    /* call GPU */
    sum<<<1, N>>>(dx);

    /* let GPU finish */
    cudaDeviceSynchronize();

    /* copy data from GPU */
    cudaMemcpy(hx, dx, nbytes, cudaMemcpyDeviceToHost);

    printf("\nhx from GPU: \n");
    for (i = 0; i < N; i++) {
        printf("%g\n", hx[i]);
    }

    cudaFree(dx);
    free(hx);

    return 0;
}

1

这是一个简单的 CUDA 内核函数,用于对一个 FLOAT 类型的数组 x 的每个元素进行加 1 的操作。下面是该代码块的解释:

__global__ void sum(FLOAT *x)
{
    int tid = threadIdx.x;

    x[tid] += 1; 
}

__global__ 定义了一个在设备端运行的函数,在 CUDA 中被称为“内核函数”。__global__ 说明符告诉编译器该函数将在设备上执行,并且是由主机CPU启动的。

sum 是函数名,其中包含一个参数 FLOAT *x,它是一个指向 FLOAT 类型数组的指针,表示输入的数据。

int tid = threadIdx.x 定义了一个整型变量 tid,用于存储当前线程的 ID。threadIdx.x 是一个内置变量,它表示当前线程在块内的唯一编号。对于一维线程块,threadIdx.x 的范围是从 0 到块大小减一。

x[tid] += 1 表示对输入数组中当前线程处理的元素位置的值加一。

这个代码块可以作为一个 CUDA 程序的一部分,与主机端的代码配合使用。当程序启动时,它将首先执行主机端的代码;主机端的代码将把需要处理的数据拷贝到设备端,然后调用内核函数 sum 对其进行处理。处理完成后,主机端的代码将把结果从设备端拷贝回主机端进行处理。该过程实现了CPU和GPU之间协同工作,发挥了二者的优势。

3

cudaDeviceSynchronize() 是一个 CUDA 运行时函数,用于同步所有在当前设备上排队的操作。它会阻塞调用线程,直到设备上的所有任务全部完成。

在 CUDA 程序中,通常需要计算内核函数执行的时间或是检查内核函数是否成功执行完毕。为了确保正确性,需要在内核函数调用之后使用 cudaDeviceSynchronize() 阻塞主机线程,等待设备端任务的完成。只有所有设备端任务都执行完毕,才能继续执行主机端代码。否则,会导致结果不准确或程序错误。

例如,以下代码片段展示了如何使用 cudaDeviceSynchronize() 排除执行内核函数的错误:

kernel<<<grid_size, block_size>>>(input, output);
cudaError_t error = cudaGetLastError();
if (error != cudaSuccess)
{
    printf("CUDA error: %s\n", cudaGetErrorString(error));
    exit(-1);
}
cudaDeviceSynchronize();

首先,使用 <<<...>>> 语法启动了一个内核函数,然后使用 cudaGetLastError() 检查是否有错误发生。如果出现错误,则会打印错误消息并退出程序。最后,使用 cudaDeviceSynchronize() 防止主机端线程继续执行,直到所有设备端任务完成。

总之,cudaDeviceSynchronize() 是一个重要的 CUDA 运行时函数,用于同步主机和设备之间的数据交互以及确保内核函数执行的正确性。

代码

与上面唯一的不同在于

 cudaMallocHost((void **)&hx, nbytes);

速度要快


#include <stdio.h>
#include <cuda.h>

typedef double FLOAT;

__global__ void sum(FLOAT *x)
{
    int tid = threadIdx.x;

    x[tid] += 1;
}

int main()
{
    int N = 32;
    int nbytes = N * sizeof(FLOAT);

    FLOAT *dx = NULL, *hx = NULL;
    int i;

    /* allocate GPU mem */
    cudaMalloc((void **)&dx, nbytes);

    if (dx == NULL) {
        printf("couldn't allocate GPU memory\n");
        return -1;
    }

    /* alllocate CPU host mem: memory copy is faster than malloc */
    cudaMallocHost((void **)&hx, nbytes);

    if (hx == NULL) {
        printf("couldn't allocate CPU memory\n");
        return -2;
    }

    /* init */
    printf("hx original: \n");
    for (i = 0; i < N; i++) {
        hx[i] = i;

        printf("%g\n", hx[i]);
    }

    /* copy data to GPU */
    cudaMemcpy(dx, hx, nbytes, cudaMemcpyHostToDevice);

    /* call GPU */
    sum<<<1, N>>>(dx);

    /* let GPU finish */
    cudaDeviceSynchronize();

    /* copy data from GPU */
    cudaMemcpy(hx, dx, nbytes, cudaMemcpyDeviceToHost);

    printf("\nhx from GPU: \n");
    for (i = 0; i < N; i++) {
        printf("%g\n", hx[i]);
    }

    cudaFree(dx);
    cudaFreeHost(hx);

    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/602363.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信小程序实现商品加入购物车案例

思考&#xff1a;购物车中的数据保存在哪里&#xff1f;用哪种数据结构进行保存&#xff1f; 小程序中可能有多个页面需要对购物车中的数据进行操作&#xff0c;因此我们想到把数据存到全局中。可以使用wx.setStorageSync()储存&#xff0c;用wx.getStorageSync()进行获取&…

Linux压缩与解压缩

目录 Linux压缩与解压缩 zip和unzip命令 定义 语法格式 参数及其作用 案例 素材准备 案例1 --- 使用zip也所文件test1.txt 案例2 --- 压缩率为最高压缩test2.txt 案例3 --- 将当前目录dir1连通目录下文件其压缩 实例4 --- 向压缩文件中test1.zip中添加test2.txt文件 实例5…

模型评估指标(一)Top-5和Top-1准确率

文章目录 一、前言二、什么是Top-5和Top-1准确率与错误率参考博客 一、前言 在看论文里面提到Top-5和top-1错误率&#xff0c;看了有点懵&#xff0c;所以去了解了一下 二、什么是Top-5和Top-1准确率与错误率 举个例子&#xff1a; 我们在训练完某个分类网络后&#xff0c…

【单目3D】在自动驾驶中将 2D 物体检测提升到 3D

Lifting 2D object detection to 3D in autonomous driving 单目 3D 目标检测使用 RGB 图像来预测目标 3D 边界框。由于 RGB 图像中缺少关键的深度信息&#xff0c;因此该任务从根本上说是不适定的。然而在自动驾驶中&#xff0c;汽车是具有&#xff08;大部分&#xff09;已知…

一文通吃:从 ZooKeeper 一致性,Leader选举讲到 ZAB 协议与 PAXOS 算法(上)

本文首发自「慕课网」&#xff0c;想了解更多IT干货内容&#xff0c;程序员圈内热闻&#xff0c;欢迎关注"慕课网"或慕课网公众号&#xff01; 作者&#xff1a;大能 | 慕课网讲师 本文将从ZooKeeper集群如何保证一致性&#xff0c;讲到zookeeper保证数据一致性的协…

打开docker-desktop报错问题解决

打开Ubuntu出现报错 Installing, this may take a few minutes... WslRegisterDistribution failed with error: 0x80070424 Error: 0x80070424 ????????? Press any key to continue... 命令行打开wsl出现报错 C:\Users\jiangcheng>wsl 指定的服务未安装。 Err…

windows环境下编译aws-sdk-cpp踩坑记

目录 1 前言 2 第一次编译 3 第二次编译 3.1 安装配置vcpkg 3.2 升级PowerShell 3.3 升级Cmake版本 3.4 vcpkg编译aws-sdk-cpp 4 工具合集下载 5 参考文献 1 前言 在做图片、视频片段存储技术调研时&#xff0c;从查阅的大量资料中&#xff0c;了解到很多人推荐的开源…

多层网关已成过去,网关多合一成潮流,网关改造正当时丨Higress 正式发布 1.0 版本

作者&#xff1a;Higress 团队 01 前言 K8s 通过 Ingress / Gateway API 将网关标准化&#xff0c;逐步将安全网关、流量网关、微服务网关内聚&#xff0c;解决从单体到微服务到云原生多层网关的复杂度&#xff0c;合久必分&#xff0c;分久必合&#xff0c;多层网关已成过去…

第21章 JQuery DataTables对角色的渲染显示

1 Services.Customers.CustomerServiceDefaults /// <summary> /// 【1个指定用户所对应的所有角色缓存键】 /// <remarks> /// 摘要&#xff1a; /// 设定一个缓存键实例&#xff0c;用于拼接1个指定的缓存键字符串&#xff0c;该缓存键字符与角色实体所有实例…

量化多因子——描述数据(空值、重复值、异常值)

数据清洗是量化的第一步&#xff0c;也是非常关键的一步。 检查数据的空值、重复值、异常值&#xff0c;并进行描述性数据分析&#xff0c;观察数据的分布情况。 缺失值&#xff1a; return_all.info() np.where(np.isnan(return_all)) np.where(np.isinf(return_all)) 重复值&…

基础巩固(五)Android通过WebView与Js交互

文章目录 简介WebView基本使用常用方法WebView的生命周期 / 状态切换关于前进 / 后退网页清除缓存数据 常用类WebSettings类常见用法&#xff1a;设置WebView缓存 WebViewClient类WebChromeClient类 注意事项如何避免WebView内存泄露 使用案例 通过WebView使得native与Js交互An…

k8s安装部署

1、基础环境 所有机器执行以下操作 hostname ipk8s-master192.168.0.121k8s-node1192.168.0.102k8s-node2192.168.0.160 docker version&#xff1a;20.10.7 k8s相关插件version&#xff1a;1.20.9 #各个机器设置自己的域名 hostnamectl set-hostname xxxx# 将 SEL…

Java中令人惊艳的五大算法,你知道多少?

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…

Golang - 选项模式 vs 构建器模式

在使用Golang创建复杂对象时&#xff0c;常用的两种模式是选项模式&#xff08;Options pattern&#xff09;和构建器模式&#xff08;Builder pattern&#xff09;。这两种模式各有优缺点&#xff0c;选择适合项目需求的模式取决于具体情况。 问题 假设我们想创建一个具有许…

【HTTP 协议】掌握 Web 的核心技术

哈喽&#xff0c;大家好~我是你们的老朋友&#xff1a;保护小周ღ 谈起 HTTP 协议&#xff08;超文本传输协议&#xff09;&#xff0c;不知道大家第一次是从什么地方了解到这个协议的呢&#xff1f;在真实的网络环境中网络协议的种类非常多&#xff0c;其中有一些耳熟能详的…

GBASE南大通用5月份公司动态一览

产品动态 5月初&#xff0c;GBASE南大通用两款新产品&#xff1a;GBase 8c V5.0和GBase 8s V8.8.5于鲲鹏开发者大会主论坛商业发行版联合发布仪式上正式发布。新版本与上一版本功能特性保持兼容&#xff0c;并在算子能力、用户级别审计、兼容性等方面全面增强&#xff0c;支持一…

最新版本 Stable Diffusion 开源 AI 绘画工具之微调模型篇

✨ 目录 &#x1f388; 模型种类&#x1f388; 变分自动编码器 / VAE&#x1f388; 美学梯度 / Aesthetic Gradients&#x1f388; 大型语言模型的低阶自适应 / LoRA&#x1f388; 超网络模型 / Hypernetwork&#x1f388; 微调模型 / LyCORIS &#x1f388; 模型种类 当你打开…

jacoco检测功能或自动化测试覆盖率

参考文档&#xff1a;http://t.csdn.cn/QqCSh http://t.csdn.cn/HonVL 目录 下载jacoco 启动jacocoagent监控被测项目 执行手工测试 生成exec文件 生成report报告 jacoco代码覆盖率报告分析 下载jacoco http://t.csdn.cn/HonVL 我下载的最新的 jacoco-0.8.10.zip 下…

虚拟化技术 — Cgroups 与 Namespaces 支撑实现的操作系统虚拟化

目录 文章目录 目录操作系统虚拟化&#xff08;容器技术&#xff09;的发展历程ChrootCgroupsCgroup SubsystemsCgroup FilesystemCgroup HierarchyCgroups 的操作规则Cgroups 的代码实现 NamespacesUTS namespacePID namespaceIPC namespaceMount namespaceNetwork namespaceU…

mysql order by 索引问题综合分析

一&#xff0c;文章1 Mysql-索引失效 order by优化_orderby索引失效_zyk1.的博客-CSDN博客 总结&#xff1a; 0&#xff0c;索引 与 查询条件 与 排序字段关系&#xff0c;Using filesort出现场景 1.联合索引&#xff0c;最左匹配原则&#xff0c;不仅查询条件需要遵循&…