cuda编程002—流

news2024/12/29 14:44:57

没有使用同步的情况:

#include <stdio.h>
#include <cuda_runtime.h>

__global__ void test_kernel(){

    printf("Message from Device.\n");
}
void test(){
    test_kernel<<<1, 1>>>();
}
#include <cuda_runtime.h>
#include <stdio.h>


void test();
int main(){
    
    test();
    printf("Message from Host.\n");

    getchar();

    return 0;
}

先调用的核函数,结果是先输出的Host:

 进行同步,代码如下:

#include <cuda_runtime.h>
#include <stdio.h>


void test();
int main(){
    
    test();
    // cudaDeviceSynchronize();  // 设备同步,整个GPU设备的同步等待任务完成
    cudaStreamSynchronize(nullptr);  // 流同步
    printf("Message from Host.\n");

    getchar();

    return 0;
}

输出结果:

cuda流整体笔记和代码

#include <math.h>
#include <stdio.h>
#include <cuda_runtime.h>

// 核函数
__global__ void test_kernel(float* array, int edge){

    int position = blockDim.x * blockIdx.x + threadIdx.x;
    if(position >= edge) return;

    array[position] *= 0.5f;
}

void test(cudaStream_t stream, float* array, int num){

    int threads = 512;
    int blocks = ceil(num / (float)threads);
    test_kernel<<<blocks, threads, 0, stream>>>(array, num);
}
#include <cuda_runtime.h>
#include <stdio.h>

// C++ 文件
void test(cudaStream_t stream, float* array, int num);

int main(){
    
    cudaStream_t stream;
    cudaEvent_t start, stop;

    // cudaEvent 是事件, 通常可以用来观察队列的执行情况
    // 比如,统计执行时间等操作
    cudaEventCreate(&start);
    cudaEventCreate(&stop);

    // 是重操作,不要随便创建太多,会消耗资源的
    // GPU计算的基本原则,是尽可能的使得计算密集,如果使用同步的话就是算一坨,等一会儿,算一坨,等一会。费劲吧啦的
    // 通过stream使得计算连续化、密集化,这样最好
    // GPU有个使用率,跟CPU使用了一样的,以GPU使用率越高越好
    cudaStreamCreate(&stream);

    cudaEventRecord(start, stream);

    int num = 10000;
    float* a = new float[num];
    for(int i=0; i < num; ++i)
        a[i] = i;

    float* a_device = nullptr;
    size_t a_bytes = sizeof(float) * num;
    cudaMalloc(&a_device, a_bytes);

    // 异步依赖的指针数据,必须在执行完成前一直存在,否则会造成例外结果
    // 并且异步执行时,对指针数据的修改,也需要合理的理解
    cudaMemcpyAsync(a_device, a, a_bytes, cudaMemcpyHostToDevice, stream);

    // 如果异步复制加上下面这段代码。会导致GPU边复制,CPU边修改,结果是a_device的内容不可控
    // 因此不要这么做,或者合理的去做你想做的
    // for(int i=0; i < num; ++i)
    //      a[i] = 500-i;


    test(stream, a_device, num);
    cudaMemcpyAsync(a, a_device, a_bytes, cudaMemcpyDeviceToHost, stream);

    cudaEventRecord(stop, stream);
    cudaEventSynchronize(stop);

    float ms = 0;
    cudaEventElapsedTime(&ms, start, stop);
    printf("核的执行时间是:%.8f ms\n", ms);

    // 打印前10个结果
    for(int i = 0; i < 10; ++i){
        printf(i == 0 ? "%.2f" : ", %.2f", a[i]);
    }
    printf("\n");
    
    // cudaStreamSynchronize(stream);
    // cudaDeviceSynchronize();  // 设备同步,整个GPU设备的同步等待任务完成
    // cudaStreamSynchronize(nullptr);  // 流同步

    /* 流的概率,stream, 类型全称是cudaStream_t
    1. 认为流是一个线程,任务级别的线程
    2. 认为流是一个任务队列
    3. 把异步执行的任务管理起来,在需要的时候等待或者做更多处理
    4. 默认流,指nullptr,如果给定为nullptr,就会使用默认流

    cuda核的执行都是异步的, 通过流来实现需要的同步

    任务队列
    队列特性:先进先出,后进后出

    cudaMemcpy 属于同步版本的内存拷贝
        等价于干了  ->  发送指令(任务队列中增加一个任务),我要复制了, cudaMemcpyAsync
                  ->  等待复制完成,cudaDeviceSynchronize

    */
    printf("Message from Host.\n");

    // 符合栈的方式分配和释放,就不用担心有bug
    delete [] a;
    
    cudaFree(a_device);
    cudaStreamDestroy(stream);
    cudaEventDestroy(start);
    cudaEventDestroy(stop);

    // getchar();

    return 0;
}

 

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

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

相关文章

蓝蓝设计-UI设计公司作品-博晖创新原子吸收光谱仪软件交互及界面设计

博晖创新原子吸收光谱仪软件交互及界面设计 图标设计 | 交互设计 | 界面设计 博晖公司拥有强大的自主研发实力&#xff0c;建立了专业的研发团队&#xff0c;通过不断的技术创新&#xff0c;形成了分子诊断、免疫诊断、原子吸收、原子荧光及质谱五大技术平台&#xff0c;并成功…

ESP8266显示gif动态图,使用U8g2库

一.代码 #include <U8g2lib.h> //实现gif火柴人跑步动画// 定义GIF动画的帧数据 const unsigned char frame1[] {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0…

安装docker服务及docker基本操作

一、docker安装&#xff08;yum安装&#xff09; 基于centos7 1.添加docker-ce 源信息 安装依赖包&#xff08;yum-utils 提供了 yum-config-manager &#xff0c;并且 device mapper 存储驱动程序需要device-mapper-persistent-data 和 lvm2&#xff09; yum install yum-…

阿丹千问V1.5-迭代升级-使用人工智能提炼文字-java代码生成流程图-百度千帆大模型

阿丹&#xff1a; 今天在学习新技的时候发现了一个可以偷懒的地方&#xff0c;在学习新的知识体系的时候需要去理解文档中的逻辑关系等等&#xff0c;那么如果有一个东西可以支持输入一段具有逻辑的文字就可以帮我提炼起其中的逻辑&#xff0c;并帮助我绘制一个流程图岂不是美哉…

Node基础--Node基础使用体验

在上一篇文章中提到我们按照好Node.js之后&#xff0c;就可以在控制台看到其版本。那么下面我们一起来看看如何使用node执行js文件代码。 (1).在本地创建一个名称为hello.js的文件&#xff0c;输入内容如下所示: console.log("helloworld");var a 1;var b 2;cons…

leetcode 118.杨辉三角

⭐️ 题目描述 &#x1f31f; leetcode链接&#xff1a;https://leetcode.cn/problems/pascals-triangle/description/ 代码&#xff1a; class Solution { public:vector<vector<int>> generate(int numRows) {// 先开空间vector<vector<int>> v;v.…

Dockerfile推送私有仓库的两个案例

一&#xff0c;编写Dockerfile制作Web应用系统nginx镜像&#xff0c;生成镜像nginx:v1.1&#xff0c;并推送其到私有仓库。 具体要求如下&#xff1a; &#xff08;1&#xff09;基于centos基础镜像&#xff1b; &#xff08;2&#xff09;指定作者信息&#xff1b; &#xff…

driver‘s license exam train

驾考训练 driver‘s license exam 1_spencer_tseng的博客-CSDN博客 driver‘s license exam 2_spencer_tseng的博客-CSDN博客 driver‘s license exam 3_spencer_tseng的博客-CSDN博客 driver‘s license exam 4_spencer_tseng的博客-CSDN博客 car indicator light_spencer…

10个必备的IntelliJ IDEA插件,提高开发效率

WakaTime 安装链接&#xff1a;https://plugins.jetbrains.com/plugin/7425-wakatime WakaTime 是一个能够根据你的编程活动&#xff0c;自动生成各种数据的工具&#xff0c;可以让你看到在编码过程中的指标、见解和时间跟踪&#xff0c;从而评估你的编码效率。 你可以准确地知…

Unity - MenuItem特性

MenuItem(string itemName, bool isValidateFunction, int priority) 参数1&#xff1a;菜单名 参数2&#xff1a;是否使用自定义条件控制菜单项是否可点击&#xff0c;默认为false&#xff0c;一般不赋值&#xff0c;需要用的话需要定义两个MenuItem MenuItem 1 : 自定义条件…

08.利用Redis实现签到功能

学习目标&#xff1a; 来源&#xff1a;黑马教程 使用Redis中BitMap数据结构使用签到功能和连续签到功能 学习产出&#xff1a; 解决方案&#xff1a; 1. 准备pom环境 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-b…

vue组件的scope 以及 如何样式穿透

个人复习&#xff01;&#xff01;&#xff01; 有什么用 让当前组件的样式不会修改到其它地方的样式&#xff0c;使用了data-v-hash的方式来使css有了它对应模块的标识 实现原理 1、给HTML的dom节点添加一个不重复的data属性(例如: data-v-5558831a)来唯一标识这个dom 元素…

openCV实战-系列教程4:图像梯度计算(Sobel算子/开运算/梯度计算方法/scharr算子/lapkacian算子)、源码解读

1、sobel算子 先读进来一个原型白色图 img cv2.imread(pie.png,cv2.IMREAD_GRAYSCALE) cv2.imshow("img",img) cv2.waitKey() cv2.destroyAllWindows() 打印结果&#xff1a; 如图有两个3*3的卷积核&#xff0c;其中A是原始图片中的一个3*3的区域&#xff0c;这个…

阿里云轻量级应用服务器和ECS有什么区别?对比表来了

阿里云轻量应用服务器和云服务器ECS有什么区别&#xff1f;ECS是专业级云服务器&#xff0c;轻量应用服务器是轻量级服务器&#xff0c;轻量服务器使用门槛更低&#xff0c;适合个人开发者或中小企业新手使用&#xff0c;可视化运维&#xff0c;云服务器ECS适合集群类、高可用、…

MySQL进阶篇之Explain执行计划

MySQL&#xff1a;Explain执行计划 使用explain关键字可以模拟优化器执行SQL查询语句&#xff0c;从而知道MySQL是如何处理你的SQL语句的&#xff0c;分析你的查询语句或是表结构的性能瓶颈。 认识explain EXPLAIN SELECT * FROM user_info i LEFT JOIN user_grade g on i.id …

朴素贝叶斯==基于样本特征来预测样本属于的类别y

目录 朴素贝叶斯基于样本特征来预测样本属于的类别y 朴素贝叶斯算法的基本概念与核心思想 假设两个特征维度之间是相互独立的 拉普拉斯平滑增加出现次数保证0不出现 ​编辑 基于样本特征来预测样本属于的类别y 什么是拉普拉斯平滑 朴素贝叶斯基于样本特征来预测样本属于的…

Springboot配置高级

临时属性设置 带属性数启动SpringBoot java –jar springboot.jar –-server.port80携带多个属性启动SpringBoot&#xff0c;属性间使用空格分隔 属性加载优先顺序 参看https://docs.spring.io/spring-boot/docs/current/reference/html/spring-boot-features.html#boot-fea…

Linux学习之vsftpd配置文件

/etc/vsftpd/vsftpd.conf是主要的vsftpd配置文件&#xff0c;主要涉及大的调整&#xff0c;cat /etc/vsftpd/vsftpd.conf | wc -l可以看到有128行内容。 /etc/vsftpd/ftpusers是禁止用户名单&#xff0c;/etc/vsftpd/user_list可以是白名单&#xff0c;也可以是黑名单。 /et…