CUDA多个流的使用
来源:互联网 发布:李莎昮子扒皮 知乎 编辑:程序博客网 时间:2024/05/17 04:26
CUDA中使用多个流并行执行数据复制和核函数运算可以进一步提高计算性能。以下程序使用2个流执行运算:
#include "cuda_runtime.h" #include <iostream> #include <stdio.h> #include <math.h> #define N (1024*1024) #define FULL_DATA_SIZE N*20 __global__ void kernel(int* a, int *b, int*c){int threadID = blockIdx.x * blockDim.x + threadIdx.x;if (threadID < N){c[threadID] = (a[threadID] + b[threadID]) / 2;}}int main(){//获取设备属性 cudaDeviceProp prop;int deviceID;cudaGetDevice(&deviceID);cudaGetDeviceProperties(&prop, deviceID);//检查设备是否支持重叠功能 if (!prop.deviceOverlap){printf("No device will handle overlaps. so no speed up from stream.\n");return 0;}//启动计时器 cudaEvent_t start, stop;float elapsedTime;cudaEventCreate(&start);cudaEventCreate(&stop);cudaEventRecord(start, 0);//创建两个CUDA流 cudaStream_t stream, stream1;cudaStreamCreate(&stream);cudaStreamCreate(&stream1);int *host_a, *host_b, *host_c;int *dev_a, *dev_b, *dev_c;int *dev_a1, *dev_b1, *dev_c1;//在GPU上分配内存 cudaMalloc((void**)&dev_a, N * sizeof(int));cudaMalloc((void**)&dev_b, N * sizeof(int));cudaMalloc((void**)&dev_c, N * sizeof(int));cudaMalloc((void**)&dev_a1, N * sizeof(int));cudaMalloc((void**)&dev_b1, N * sizeof(int));cudaMalloc((void**)&dev_c1, N * sizeof(int));//在CPU上分配页锁定内存 cudaHostAlloc((void**)&host_a, FULL_DATA_SIZE * sizeof(int), cudaHostAllocDefault);cudaHostAlloc((void**)&host_b, FULL_DATA_SIZE * sizeof(int), cudaHostAllocDefault);cudaHostAlloc((void**)&host_c, FULL_DATA_SIZE * sizeof(int), cudaHostAllocDefault);//主机上的内存赋值 for (int i = 0; i < FULL_DATA_SIZE; i++){host_a[i] = i;host_b[i] = FULL_DATA_SIZE - i;}for (int i = 0; i < FULL_DATA_SIZE; i += 2 * N){cudaMemcpyAsync(dev_a, host_a + i, N * sizeof(int), cudaMemcpyHostToDevice, stream);cudaMemcpyAsync(dev_b, host_b + i, N * sizeof(int), cudaMemcpyHostToDevice, stream);cudaMemcpyAsync(dev_a1, host_a + i + N, N * sizeof(int), cudaMemcpyHostToDevice, stream1);cudaMemcpyAsync(dev_b1, host_b + i + N, N * sizeof(int), cudaMemcpyHostToDevice, stream1);kernel << <N / 1024, 1024, 0, stream >> > (dev_a, dev_b, dev_c);kernel << <N / 1024, 1024, 0, stream1 >> > (dev_a, dev_b, dev_c1);cudaMemcpyAsync(host_c + i, dev_c, N * sizeof(int), cudaMemcpyDeviceToHost, stream);cudaMemcpyAsync(host_c + i + N, dev_c1, N * sizeof(int), cudaMemcpyDeviceToHost, stream1);}// 等待Stream流执行完成cudaStreamSynchronize(stream);cudaStreamSynchronize(stream1);cudaEventRecord(stop, 0);cudaEventSynchronize(stop);cudaEventElapsedTime(&elapsedTime, start, stop);std::cout << "消耗时间: " << elapsedTime << std::endl;//输出前10个结果 for (int i = 0; i < 10; i++){std::cout << host_c[i] << std::endl;}getchar();// free stream and mem cudaFreeHost(host_a);cudaFreeHost(host_b);cudaFreeHost(host_c);cudaFree(dev_a);cudaFree(dev_b);cudaFree(dev_c);cudaFree(dev_a1);cudaFree(dev_b1);cudaFree(dev_c1);cudaStreamDestroy(stream);cudaStreamDestroy(stream1);return 0;}
使用2个流,执行时间16ms,基本上是使用一个流消耗时间的二分之一。
0 0
- CUDA多个流的使用
- CUDA 纹理的使用
- CUDA 纹理的使用
- cuda常量内存的使用
- CUDA使用CUDAArray的纹理
- cuda中模板的使用
- CUDA纹理内存的使用
- CUDA中模板的使用
- CUDA 中 FFT 的使用
- CUDA 中 FFT 的使用
- (CUDA 编程9).CUDA shared memory使用------GPU的革命
- CUDA纹理存储器的特性及其使用
- 使用CUDA驱动API的简单例子
- CUDA纹理存储器的特性及其使用
- CUDA纹理存储器的特性及其使用
- VS2008+QT中使用CUDA的示例
- OpenCL和CUDA的使用比较
- opencv与cuda的结合使用
- 备份mysql数据库
- installshield安装包类破解->全国计算机二级C语言软件破解
- ubuntu通过命令行设置较短的密码
- Nginx系列之反向代理的妙用
- python __getattribute__ 和 __getattr__的区别
- CUDA多个流的使用
- Docker安装(在Macbook中安装Docker)后配置阿里云加速器
- POJ 3057 Evacuation(BFS+二分图匹配)
- 最受欢迎的Python开源框架有哪些?
- 搭建SpringBoot的web-mvc项目
- 为一台华硕笔记本重装系统记录
- matlab之使用技巧
- vue-cli的webpack模板项目配置文件分析
- C++常见面试题