cuda编程002—流
没有使用同步的情况:
#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_t1. 认为流是一个线程,任务级别的线程2. 认为流是一个任务队列3. 把异步执行的任务管理起来,在需要的时候等待或者做更多处理4. 默认流,指nullptr,如果给定为nullptr,就会使用默认流cuda核的执行都是异步的, 通过流来实现需要的同步任务队列队列特性:先进先出,后进后出cudaMemcpy 属于同步版本的内存拷贝等价于干了 -> 发送指令(任务队列中增加一个任务),我要复制了, cudaMemcpyAsync-> 等待复制完成,cudaDeviceSynchronize*/printf("Message from Host.\n");// 符合栈的方式分配和释放,就不用担心有bugdelete [] a;cudaFree(a_device);cudaStreamDestroy(stream);cudaEventDestroy(start);cudaEventDestroy(stop);// getchar();return 0;
}
相关文章:

cuda编程002—流
没有使用同步的情况: #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> #i…...

2023年国赛 高教社杯数学建模思路 - 案例:粒子群算法
文章目录 1 什么是粒子群算法?2 举个例子3 还是一个例子算法流程算法实现建模资料 # 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 什么是粒子群算法? 粒子群算法(Pa…...

【C#学习笔记】数据类中常用委托及接口——以List<T>为例
文章目录 List\<T\>/LinkedList \<T\>为什么是神?(泛型为什么是神)一些常见,通用的委托和接口ComparisonEnumerator List<T>/LinkedList <T>为什么是神?(泛型为什么是神࿰…...

idea的断点调试
1、行断点 首先在代码的最左侧点击会显示红色的圆圈 第二步在main方法中右键选中debug run进行运行 会出现下面图片的情况 出现上图之后,点击console 下一步 这个时候就可以看到调试的结果了 6、方法调用栈:这里显示了该线程调试所经过的所有方法&…...

vue和react学哪一个比较有助于以后发展?
前言 首先声明vue和react这两个框架都是很优秀的前端框架,使用的人群下载量上数量也是相当的庞大,这篇文章没有贬低或者攻击任何一个框架的意思,只在于根据答主的问题来对这两个框架做出对比,以方便大家更加清晰的了解到当下vue和…...

【SkyWalking】分布式服务追踪与调用链系统
1、基本介绍 SkyWalking是一个开源的观测平台,官网:Apache SkyWalking; 可监控:分布式追踪调用链 、jvm内存变化、监控报警、查看服务器基本配置信息。 2、SkyWalking架构原理 在整个skywalking的系统中,有三个角色&am…...

Python“牵手”速卖通商品详情API接口运用场景及功能介绍
速卖通电商API接口是针对速卖通提供的电商服务平台,为开发人员提供了简单、可靠的技术来与速卖通电商平台进行数据交互,实现一系列开发、管理和营销等操作。其中包括商品详情API接口,通过这个API接口商家可以获取商品的详细信息,包…...
java调用python脚本的示例
java调用python脚本的示例 import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader;public class JavaCallPythonScript {public static void main(String[] args) {// 调用Python脚本的命令String pythonScriptPath "path/to/y…...
【C语言】柔性数组(可边长数组)
一、介绍 柔性数组(Flexible Array),又称可变长数组。一般数组的长度是在编译时确定,而柔性数组对象的长度在运行时确定。在定义结构体时允许创建一个空数组(例如:arr [ 0 ] ),该数…...

C++信息学奥赛1131:基因相关性
这段代码的功能是比较两个字符串的相似度,并根据给定的阈值判断是否相似。 解析注释后的代码如下: #include <iostream> #include <string> using namespace std;int main() {double bf; // 定义双精度浮点数变量bf,用于存储阈…...
如何保证分布式系统中服务的高可用性:应对 ZooKeeper Leader 节点故障的注册处理策略
推荐阅读 AI文本 OCR识别最佳实践 AI Gamma一键生成PPT工具直达链接 玩转cloud Studio 在线编码神器 玩转 GPU AI绘画、AI讲话、翻译,GPU点亮AI想象空间 资源分享 「java、python面试题」来自UC网盘app分享,打开手机app,额外获得1T空间 https://dr…...

SQL注入之延时注入
文章目录 延时注入是什么?延时注入获取数据库版本号 延时注入是什么? 延时注入就是利用sleep()函数通过if语句判断所写的语句真假,如果为真返回我们想要的东西(例如:数据库的长度,数据库的名字等࿰…...

运维高级学习--Docker(二)
1、使用mysql:5.6和 owncloud 镜像,构建一个个人网盘。 #拉取mysql5.6和owncloud镜像 [rootlocalhost ~]# docker pull mysql:5.6 [rootlocalhost ~]# docker pull owncloud [rootlocalhost ~]# docker images REPOSITORY TAG IMAGE ID CREATED …...

QT的核心——信号与槽
目录 回顾C 语言信号 1、信号与槽 2、关联信号与槽 2.1自动关联信号与槽 2.2手动关联信号与槽 2.3断开信号与槽 3、自定义信号 3.1自定义信号使用条件 3.2自定义槽函数使用条件 4、信号与槽参数传递 4.1自定义一个带参的信号 4.2关联带参的信号与槽 4.3发送一个带…...

【业务功能篇73】web系统架构演变-单体-集群-垂直化-服务化-微服务化
1.服务架构的演 1.1 单体架构 单体架构应该是我们最先接触到的架构实现了,在单体架构中使用经典的三层模型,即表现层,业务逻辑层和数据访问层。 单体架构只适合在应用初期,且访问量比较下的情况下使用,优点是性价比很…...

MyCAT命令行监控
9066端口 ,用mysql命令行连接 Mysql –utest –ptest –P9066 show help 可显示所有相关管理命令 显示后端物理库连接信息,包括当前连接数,端口 Show backend Show connection 显示当前前端客户端连接情况,已经网络流量信息、…...

【python】正则表达式匹配数据
前言 使用正则表达式处理数据,可进行字符串匹配、提取和替换等操作。在python中,通过re库完成正则匹配的操作。 一、正则语法规则 1.常用匹配符 模式描述^匹配字符串开头$匹配字符串结尾.匹配任意字符*匹配前面的字符零次或多次匹配前面的字符一次或多…...

【C++】用Windows API在控制台实现选择选项
2023年8月23日,周三上午 今天上午花了一个小时来实现这个 这个程序在碰到边界时会发出声音, 通过调用Windows API的Beep函数来实现。 #include<Windows.h> #include<conio.h> #include<iostream> #include<cstdlib>const int …...
Golang 批量执行/并发执行
提到Golang,都说Golang 天生高并发。所以分享一下我认为的Golang高并发精髓 简单的并发执行util package util import ("context""sync" )type batchRunner struct {BatchSize intctx context.Contextchannel chan func()wg sy…...

使用go语言、Python脚本搭建一个简单的chatgpt服务网站。
使用go语言、Python脚本搭建一个简单的GPT服务网站 前言 研0在暑假想提升一下自己,自学了go语言编程和机器学习相关学习,但是一味学习理论,终究是枯燥的,于是自己弄点小项目做。 在这之前,建议您需要掌握以下两个技…...

华为云AI开发平台ModelArts
华为云ModelArts:重塑AI开发流程的“智能引擎”与“创新加速器”! 在人工智能浪潮席卷全球的2025年,企业拥抱AI的意愿空前高涨,但技术门槛高、流程复杂、资源投入巨大的现实,却让许多创新构想止步于实验室。数据科学家…...
内存分配函数malloc kmalloc vmalloc
内存分配函数malloc kmalloc vmalloc malloc实现步骤: 1)请求大小调整:首先,malloc 需要调整用户请求的大小,以适应内部数据结构(例如,可能需要存储额外的元数据)。通常,这包括对齐调整,确保分配的内存地址满足特定硬件要求(如对齐到8字节或16字节边界)。 2)空闲…...
反向工程与模型迁移:打造未来商品详情API的可持续创新体系
在电商行业蓬勃发展的当下,商品详情API作为连接电商平台与开发者、商家及用户的关键纽带,其重要性日益凸显。传统商品详情API主要聚焦于商品基本信息(如名称、价格、库存等)的获取与展示,已难以满足市场对个性化、智能…...

智慧工地云平台源码,基于微服务架构+Java+Spring Cloud +UniApp +MySql
智慧工地管理云平台系统,智慧工地全套源码,java版智慧工地源码,支持PC端、大屏端、移动端。 智慧工地聚焦建筑行业的市场需求,提供“平台网络终端”的整体解决方案,提供劳务管理、视频管理、智能监测、绿色施工、安全管…...

使用分级同态加密防御梯度泄漏
抽象 联邦学习 (FL) 支持跨分布式客户端进行协作模型训练,而无需共享原始数据,这使其成为在互联和自动驾驶汽车 (CAV) 等领域保护隐私的机器学习的一种很有前途的方法。然而,最近的研究表明&…...
【解密LSTM、GRU如何解决传统RNN梯度消失问题】
解密LSTM与GRU:如何让RNN变得更聪明? 在深度学习的世界里,循环神经网络(RNN)以其卓越的序列数据处理能力广泛应用于自然语言处理、时间序列预测等领域。然而,传统RNN存在的一个严重问题——梯度消失&#…...

P3 QT项目----记事本(3.8)
3.8 记事本项目总结 项目源码 1.main.cpp #include "widget.h" #include <QApplication> int main(int argc, char *argv[]) {QApplication a(argc, argv);Widget w;w.show();return a.exec(); } 2.widget.cpp #include "widget.h" #include &q…...
【android bluetooth 框架分析 04】【bt-framework 层详解 1】【BluetoothProperties介绍】
1. BluetoothProperties介绍 libsysprop/srcs/android/sysprop/BluetoothProperties.sysprop BluetoothProperties.sysprop 是 Android AOSP 中的一种 系统属性定义文件(System Property Definition File),用于声明和管理 Bluetooth 模块相…...

人机融合智能 | “人智交互”跨学科新领域
本文系统地提出基于“以人为中心AI(HCAI)”理念的人-人工智能交互(人智交互)这一跨学科新领域及框架,定义人智交互领域的理念、基本理论和关键问题、方法、开发流程和参与团队等,阐述提出人智交互新领域的意义。然后,提出人智交互研究的三种新范式取向以及它们的意义。最后,总结…...

解析两阶段提交与三阶段提交的核心差异及MySQL实现方案
引言 在分布式系统的事务处理中,如何保障跨节点数据操作的一致性始终是核心挑战。经典的两阶段提交协议(2PC)通过准备阶段与提交阶段的协调机制,以同步决策模式确保事务原子性。其改进版本三阶段提交协议(3PC…...