CUDA编程模型系列十( CUDA Stream / CUDA 流 / 多流执行)

news/2024/11/16 22:50:33/

CUDA编程模型系列十( CUDA Stream / CUDA 流 / 多流执行)

本系列视频目的是帮助开发者们一步步地学会利用CUDA编程模型加速GPU应用, 我们的口号是: 让GPU飞起来
本期我介绍了CUDA 中Stream的概念和使用方法, CUDA流也是很多CUDA加速库(cuBLAS, cuDNN, TensorRT)中常用的手段, 它能让多个执行队列并行执行, 还能让这些队列执行的过程中相对独立, 彼此不受影响

// cuda stream
// cuda lib, cudnn cublas tensort
// stream-- 一系列的指令执行队列
// mul-stream -- asyn -- order-- asyn#include <stdio.h>
#include <math.h>// a[] + b[] = c[]#define N (1024 * 1024)
#define FULL_SIZE (N * 30)
//stream[2] __global__ void kernel(int *a, int *b, int *c)
{int idx = threadIdx.x + blockDim.x * blockIdx.x;if( idx < N){int idx1 = (idx + 1)%256;int idx2 = (idx + 2)%256;float as = (a[idx] + a[idx1] + a[idx2]) / 3.0;float bs = (b[idx] + b[idx1] + b[idx2]) / 3.0;c[idx] = (as + bs)/2;}
}int main()
{cudaDeviceProp prop;int whichDevice;cudaGetDevice(&whichDevice);cudaGetDeviceProperties(&prop, whichDevice);if( !prop.deviceOverlap ){printf("Your device will not support speed up from multi-streams\n");return 0;}cudaEvent_t start, stop;float elapsedTime;cudaStream_t my_stream[3];int *h_a, *h_b, *h_c;int *d_a0, *d_b0, *d_c0;int *d_a1, *d_b1, *d_c1;int *d_a2, *d_b2, *d_c2;cudaEventCreate(&start);cudaEventCreate(&stop);cudaStreamCreate(&my_stream[0]);cudaStreamCreate(&my_stream[1]);cudaStreamCreate(&my_stream[2]);cudaMalloc((void**) &d_a0, N * sizeof(int));cudaMalloc((void**) &d_b0, N * sizeof(int));cudaMalloc((void**) &d_c0, N * sizeof(int));cudaMalloc((void**) &d_a1, N * sizeof(int));cudaMalloc((void**) &d_b1, N * sizeof(int));cudaMalloc((void**) &d_c1, N * sizeof(int));cudaMalloc((void**) &d_a2, N * sizeof(int));cudaMalloc((void**) &d_b2, N * sizeof(int));cudaMalloc((void**) &d_c2, N * sizeof(int));cudaHostAlloc((void**) &h_a, FULL_SIZE * sizeof(int), cudaHostAllocDefault);cudaHostAlloc((void**) &h_b, FULL_SIZE * sizeof(int), cudaHostAllocDefault);cudaHostAlloc((void**) &h_c, FULL_SIZE * sizeof(int), cudaHostAllocDefault);for(int i = 0; i<FULL_SIZE; i++){h_a[i] = rand()%1024;h_b[i] = rand()%1024;}cudaEventRecord(start);for(int i = 0; i < FULL_SIZE; i += N * 1){cudaMemcpyAsync(d_a0, h_a+i, N*sizeof(int), cudaMemcpyHostToDevice, my_stream[0]);//cudaMemcpyAsync(d_a1, h_a+i+N, N*sizeof(int), cudaMemcpyHostToDevice, my_stream[1]);//cudaMemcpyAsync(d_a2, h_a+i+N+N, N*sizeof(int), cudaMemcpyHostToDevice, my_stream[2]);cudaMemcpyAsync(d_b0, h_a+i, N*sizeof(int), cudaMemcpyHostToDevice, my_stream[0]);//cudaMemcpyAsync(d_b1, h_a+i+N, N*sizeof(int), cudaMemcpyHostToDevice, my_stream[1]);//cudaMemcpyAsync(d_b2, h_a+i+N+N, N*sizeof(int), cudaMemcpyHostToDevice, my_stream[2]);kernel<<<N/256, 256, 0, my_stream[0]>>>(d_a0, d_b0, d_c0);//kernel<<<N/256, 256, 0, my_stream[1]>>>(d_a1, d_b1, d_c1);//kernel<<<N/256, 256, 0, my_stream[2]>>>(d_a2, d_b2, d_c2);cudaMemcpyAsync(h_c+i, d_c0, N*sizeof(int), cudaMemcpyDeviceToHost, my_stream[0]);//cudaMemcpyAsync(h_c+i+N, d_c0, N*sizeof(int), cudaMemcpyDeviceToHost, my_stream[0]);//cudaMemcpyAsync(h_c+i+N+N, d_c0, N*sizeof(int), cudaMemcpyDeviceToHost, my_stream[0]);}cudaStreamSynchronize(my_stream[0]);cudaStreamSynchronize(my_stream[1]);cudaStreamSynchronize(my_stream[2]);cudaEventRecord(stop, 0);cudaEventSynchronize(stop);cudaEventElapsedTime(&elapsedTime , start, stop);printf("Time: %3.2f ms\n", elapsedTime);// cudaFreereturn 0;
}

http://www.ppmy.cn/news/1010125.html

相关文章

泛型和通配符

目录 1. 什么是泛型 2. 泛型是如何编译的&#xff1f; 3. 泛型的上界 小栗子1&#xff1a; 小栗子2&#xff1a; 4. 泛型方法 5. 通配符 小栗子&#xff1a; 错误的做法和原因&#xff1a; 6. 通配符的上界&#xff08;多用来取数据&#xff09; 7. 通配符的下界&am…

协议,序列化,反序列化,Json

文章目录 协议序列化和反序列化网络计算器protocol.hppServer.hppServer.ccClient.hppClient.cclog.txt通过结果再次理解通信过程 Json效果 协议 协议究竟是什么呢&#xff1f;首先得知道主机之间的网络通信交互的是什么数据&#xff0c;像平时使用聊天APP聊天可以清楚&#x…

【深入算法-预备式-从数学展开】常用数学符号(希腊字母)的拼读方法

希腊字母表 大写小写英文注音国际音标注音中文注音Ααalphaalfa阿耳法Ββbetabeta贝塔Γγgammagamma伽马Δδdetadelta德耳塔Εεepsilonepsilon艾普西隆Ζζzetazeta截塔Ηηetaeta艾塔Θθthetaθita西塔Ιιiotaiota约塔Κκkappakappa卡帕∧λlambdalambda兰姆达Μμmu…

笔试真题解析 | 7.23小红书笔试三道编程题

恭喜发现宝藏!搜索公众号【TechGuide】回复公司名,解锁更多新鲜好文和互联网大厂的笔经面经。 作者@TechGuide【全网同名】 订阅专栏【进阶版】2023最新大厂笔试真题 & 题解,不容错过的宝藏资源! 第一题:小盖的数组构造 题目描述 小盖希望你构造一个数组满足以下条…

关于游戏的笔记

关于搭建秦时明月2一键端&#xff0c;并且开启秘境神秘商人东海寻仙幻化 1.该游戏下主要的目录 gm端 服务框架 服务端 2.修改对应的文件 C:\qs\Q2Server\server\conf_common\ManagerAddress.xmlC:\qs\Q2Server\server\conf_manager\GateServer.xml修改ip 3.启动gm startup…

Lambda表达式总结

Lambda作为Java8的新特性&#xff0c;本篇文章主要想总结一下常用的一下用法和api 1.接口内默认方法实现 public interface Formula {double calculate(int a);// 默认方法default double sqrt(int a) {return Math.sqrt(a);} }public static void main(String[] args) {Form…

字符串查找匹配算法

概述 字符串匹配&#xff08;查找&#xff09;是字符串的一种基本操作&#xff1a;给定带匹配查询的文本串S和目标子串T&#xff0c;T也叫做模式串。在文本S中找到一个和模式T相符的子字符串&#xff0c;并返回该子字符串在文本中的位置。 暴力匹配 Brute Force Algorithm&a…

正则表达式必知必会

文章目录 前言匹配单个字符匹配任意字符匹配一组字符取非匹配元字符匹配数字匹配所有字母和数字匹配空白字符重复匹配避免过度匹配边界匹配字符串边界子表达式回溯引用回溯引用中的替换操作向前查找向后查找 前言 在工作中使用正则表达式可以提高我们的效率&#xff0c;这篇博…