利用两个流进行操作演示

项目下载链接

  1 /*
  2 * Copyright 1993-2010 NVIDIA Corporation.  All rights reserved.
  3 *
  4 * NVIDIA Corporation and its licensors retain all intellectual property and
  5 * proprietary rights in and to this software and related documentation.
  6 * Any use, reproduction, disclosure, or distribution of this software
  7 * and related documentation without an express license agreement from
  8 * NVIDIA Corporation is strictly prohibited.
  9 *
 10 * Please refer to the applicable NVIDIA end user license agreement (EULA)
 11 * associated with this source code for terms and conditions that govern
 12 * your use of this NVIDIA software.
 13 *
 14 */
 15
 16
 17 #include "../common/book.h"
 18 #include "cuda.h"
 19 #include "cuda_runtime.h"
 20 #include "device_launch_parameters.h"
 21 #define N   (1024*1024)
 22 #define FULL_DATA_SIZE   (N*20)
 23
 24
 25 __global__ void kernel(int *a, int *b, int *c) {
 26     int idx = threadIdx.x + blockIdx.x * blockDim.x;
 27     if (idx < N) {
 28         int idx1 = (idx + 1) % 256;
 29         int idx2 = (idx + 2) % 256;
 30         float   as = (a[idx] + a[idx1] + a[idx2]) / 3.0f;
 31         float   bs = (b[idx] + b[idx1] + b[idx2]) / 3.0f;
 32         c[idx] = (as + bs) / 2;
 33     }
 34 }
 35
 36
 37 int main(void) {
 38     cudaDeviceProp  prop;
 39     int whichDevice;
 40     HANDLE_ERROR(cudaGetDevice(&whichDevice));
 41     HANDLE_ERROR(cudaGetDeviceProperties(&prop, whichDevice));
 42     if (!prop.deviceOverlap) {
 43         printf("Device will not handle overlaps, so no speed up from streams\n");
 44         return 0;
 45     }
 46
 47     cudaEvent_t     start, stop;
 48     float           elapsedTime;
 49
 50     cudaStream_t    stream0, stream1;
 51     int *host_a, *host_b, *host_c;
 52     int *dev_a0, *dev_b0, *dev_c0;
 53     int *dev_a1, *dev_b1, *dev_c1;
 54
 55     // start the timers
 56     HANDLE_ERROR(cudaEventCreate(&start));
 57     HANDLE_ERROR(cudaEventCreate(&stop));
 58
 59     //初始化两个流
 60     HANDLE_ERROR(cudaStreamCreate(&stream0));
 61     HANDLE_ERROR(cudaStreamCreate(&stream1));
 62
 63     // allocate the memory on the GPU
 64     HANDLE_ERROR(cudaMalloc((void**)&dev_a0,
 65         N * sizeof(int)));
 66     HANDLE_ERROR(cudaMalloc((void**)&dev_b0,
 67         N * sizeof(int)));
 68     HANDLE_ERROR(cudaMalloc((void**)&dev_c0,
 69         N * sizeof(int)));
 70     HANDLE_ERROR(cudaMalloc((void**)&dev_a1,
 71         N * sizeof(int)));
 72     HANDLE_ERROR(cudaMalloc((void**)&dev_b1,
 73         N * sizeof(int)));
 74     HANDLE_ERROR(cudaMalloc((void**)&dev_c1,
 75         N * sizeof(int)));
 76
 77     //在主机上分配锁定页内存
 78     HANDLE_ERROR(cudaHostAlloc((void**)&host_a,
 79         FULL_DATA_SIZE * sizeof(int),
 80         cudaHostAllocDefault));
 81     HANDLE_ERROR(cudaHostAlloc((void**)&host_b,
 82         FULL_DATA_SIZE * sizeof(int),
 83         cudaHostAllocDefault));
 84     HANDLE_ERROR(cudaHostAlloc((void**)&host_c,
 85         FULL_DATA_SIZE * sizeof(int),
 86         cudaHostAllocDefault));
 87
 88     for (int i = 0; i<FULL_DATA_SIZE; i++) {
 89         host_a[i] = rand();
 90         host_b[i] = rand();
 91     }
 92
 93     HANDLE_ERROR(cudaEventRecord(start, 0));
 94     // now loop over full data, in bite-sized chunks
 95     for (int i = 0; i<FULL_DATA_SIZE; i += N * 2) {
 96         // enqueue copies of a in stream0 and stream1
 97         HANDLE_ERROR(cudaMemcpyAsync(dev_a0, host_a + i,
 98             N * sizeof(int),
 99             cudaMemcpyHostToDevice,
100             stream0));
101         HANDLE_ERROR(cudaMemcpyAsync(dev_a1, host_a + i + N,
102             N * sizeof(int),
103             cudaMemcpyHostToDevice,
104             stream1));
105         // enqueue copies of b in stream0 and stream1
106         HANDLE_ERROR(cudaMemcpyAsync(dev_b0, host_b + i,
107             N * sizeof(int),
108             cudaMemcpyHostToDevice,
109             stream0));
110         HANDLE_ERROR(cudaMemcpyAsync(dev_b1, host_b + i + N,
111             N * sizeof(int),
112             cudaMemcpyHostToDevice,
113             stream1));
114
115         // enqueue kernels in stream0 and stream1
116         kernel << <N / 256, 256, 0, stream0 >> >(dev_a0, dev_b0, dev_c0);
117         kernel << <N / 256, 256, 0, stream1 >> >(dev_a1, dev_b1, dev_c1);
118
119         //从设备上将结果拷贝回主机上的锁定页内存
120         HANDLE_ERROR(cudaMemcpyAsync(host_c + i, dev_c0,
121             N * sizeof(int),
122             cudaMemcpyDeviceToHost,
123             stream0));
124         HANDLE_ERROR(cudaMemcpyAsync(host_c + i + N, dev_c1,
125             N * sizeof(int),
126             cudaMemcpyDeviceToHost,
127             stream1));
128     }
129     //将计算结果从锁定页内存复制会主机内存
130     HANDLE_ERROR(cudaStreamSynchronize(stream0));
131     HANDLE_ERROR(cudaStreamSynchronize(stream1));
132
133     HANDLE_ERROR(cudaEventRecord(stop, 0));
134
135     HANDLE_ERROR(cudaEventSynchronize(stop));
136     HANDLE_ERROR(cudaEventElapsedTime(&elapsedTime,
137         start, stop));
138     printf("Time taken:  %3.1f ms\n", elapsedTime);
139
140     // cleanup the streams and memory
141     HANDLE_ERROR(cudaFreeHost(host_a));
142     HANDLE_ERROR(cudaFreeHost(host_b));
143     HANDLE_ERROR(cudaFreeHost(host_c));
144     HANDLE_ERROR(cudaFree(dev_a0));
145     HANDLE_ERROR(cudaFree(dev_b0));
146     HANDLE_ERROR(cudaFree(dev_c0));
147     HANDLE_ERROR(cudaFree(dev_a1));
148     HANDLE_ERROR(cudaFree(dev_b1));
149     HANDLE_ERROR(cudaFree(dev_c1));
150     HANDLE_ERROR(cudaStreamDestroy(stream0));
151     HANDLE_ERROR(cudaStreamDestroy(stream1));
152
153     return 0;
154 }
时间: 2024-10-09 15:40:43

利用两个流进行操作演示的相关文章

java -io字符流FileWrite操作演示

FileWriter字符输出流演示: /* * FiileWriter 字符流的操作 * FileWriter 的构造方法 可传递 File类型 还可以传递String类型 * * 方法 : * write(int c) 传递一个字节 * write(char[] a ) 传递一个字符数组 * write(char[]a , 开始索引 , 传递几个) * write(String s) 传递一个字符串 * * 注意:写完之后一定要刷新缓冲区 不然数据 写入不进 * 对象.flush() * */

SDNLAB技术分享(四):利用ODL下发流表创建VxLAN网络

邓晓涛,当前就职于江苏省未来网络创新研究院,是CDN团队的一名研发人员,主要从事SDN相关的研发相关工作.曾就职于三星电子于先行解决方案研发组任高级工程师.思科系统于云协作应用技术部(CCATG)任工程师.-----------------------------------------------------------------------------------------------------[分享正文]今天想跟大家分享如何通过ODL控制器下发流表来创建VxLAN网络.ODL作为当前

利用腾讯视频吸引操作网赚项目

这次来分享点小干货吧,其实也不算特别干的那种,因为这次分享的干货在之前也是有的,只是平台不一样而已.在网络上的干货非常之多,但是仍然还是人不停的嚷嚷着要干货,所以有些时候不弄点所谓的干货,还真的没办法让让大家息怒啊.不过也没事儿,每写一次干货就意味着自己对这个知识点有了更加深刻的认识,就像平时读书一样,一个观点或者方法分享多了,自然对这个方法或观点的理解又会有一个更深的理解,所以有时候总觉得分享干货就是人生中的一种修行. 利用腾讯视频吸引网上狼友操作网赚项目赚钱 谈起这次分享的干货,还得益于自己

java流的操作

java中的流,简单理解就是管道里有流水具体到java中可以分为输入流和输出流 InputStream.OutPutStream是字节输入流的所有类的超类. Reader.Writer是字符输入流的所有类的超类.  Java IO流对象 1.输入字节流InputStreamIO 中输入字节流的继承图可见 InputStream 是所有的输入字节流的父类,它是一个抽象类. ByteArrayInputStream.StringBufferInputStream.FileInputStream 是三

C# IO流的操作

C# IO流的操作非常重要,我们读写文件都会使用到这个技术,这里先演示一个文件内容复制的例子,简要说明C#中的IO操作. namespace ConsoleApplication1 {     class Program     {         static void Main(string[] args)         {             //将文件内容读到流中             Stream stream = File.Open("test.txt", File

IO包中的其他类 打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组

打印流,序列流,操作对象,管道流,RandomAccessFile,操作基本数据类型,操作字节数组 一.打印流: 该流提供了打印方法,可以将各种数据类型的数据都原样打印. 字节打印流PrintStream构造函数可以接收的参数类型1.File对象 File2.字符串路径 String3.字节输出流 OutputStream 字符打印流PrintWriter(更常用)1.File对象 File2.字符串路径 String3.字节输出流 OutputStream4.字符输出流 Writer publ

Delphi流的操作

Delphi流的操作 一.流的概念 流简单说是建立在面向对象基础上的一种抽象的处理数据的工具,它定义了一些处理数据的基本操作,如读取数据,写入数据等,程序员只需掌握对流进行操作,而不用关心流的另一头数据的真正流向.其实,流就是把整个对象转化为一个一个单字节数据,然后形成数据流,其形同把固体石块打碎成一颗颗细小的沙子一样,最后可以形成流沙. 二.流的主要功能 流的主要功能是对文件与非文件数据相互转换进行操作(即它们之间的I/O操作).如将图片文件保存到数据库,那么数据库中的图片数据就变成非文件数据

阿里云ECS操作演示

12.ECS操作演示查看ECS实例适用场景:实例的日常维护实例运行状态和详细信息查看启动ECS实例适用场景:实例停止运行之后的再次启动停止.重启实例适用场景:实例运行的服务暂停时使用停止实例实例运行的服务需要重启服务器时使用重启实例ECS实例操作 设置/取消自动释放时间适用场景:创建临时实例解决业务高峰,高峰结束后自动释放当业务高峰没有停止时,可以取消自动释放管理控制台演示13.ECS磁盘操作挂载数据盘适用场景:当ECS实例运行的服务需要的数据存储不够时挂载数据盘有两种入口1. 从实例操作入口2

Java文件IO流的操作总结

流就是管道,向管道里面写数据用输出流.write 从管道里面读数据,用输入流.read 流,按照不同的维度有不同的分类,按照从流中每次读取数据单位不同,划分为字节流字符流 按照流-对应操作的角色的不同(是IO设备,还是其他流)是否能够直接向特定的IO设备如文件.网络.磁盘等,能够直接与这些进行读写的称之为节点流, 对节点流进一步封装的流,通过封装后的流来实现读写功能,处理流也被称为高级流 流和数组不一样,不能通过索引读写数据.在流中,你也不能像数组那样前后移动读取数据,除非使用RandomAcc