CUDA Vector Add Test 2048x1024

  1 #include "cuda_runtime.h"  // CUDAVectorAdd.cu
  2 #include "device_launch_parameters.h"
  3 #include "IML_PrecisionTimer.h"
  4
  5 #include <stdio.h>
  6 #define MEM_SIZE  (2048*1024)
  7
  8 __global__ void addKernel(float *c, float *a, float *b, int N)
  9 {
 10     int i = blockIdx.x * blockDim.x +threadIdx.x;
 11     if (i<N)
 12     {
 13         c[i] = a[i] + b[i];
 14     }
 15 }
 16
 17 int main()
 18 {
 19     PrecisionTimer g_timer;
 20     float gfFrametime;
 21     qPrecisionTimer_Init(&g_timer);
 22
 23     float *a;
 24     float *b;
 25     float *c;
 26
 27     int size =MEM_SIZE;
 28     int i;
 29
 30     a = (float*)malloc(size*sizeof(float));
 31     b = (float*)malloc(size*sizeof(float));
 32     c = (float*)malloc(size*sizeof(float));
 33
 34     for( i = 1; i< size; i++)
 35     {
 36         a[i] = i;
 37         b[i] = i;
 38     }
 39     g_timer.Start( &g_timer );
 40
 41     float *dev_a;
 42     float *dev_b;
 43     float *dev_c;
 44
 45
 46     cudaError_t cudaStatus;
 47
 48     // Allocate GPU buffers for three vectors (two input, one output)    .
 49     cudaStatus = cudaMalloc((void**)&dev_c, size * sizeof(float));
 50     if (cudaStatus != cudaSuccess) {
 51         fprintf(stderr, "cudaMalloc failed!");
 52     }
 53
 54     cudaStatus = cudaMalloc((void**)&dev_a, size * sizeof(float));
 55     if (cudaStatus != cudaSuccess) {
 56         fprintf(stderr, "cudaMalloc failed!");
 57     }
 58
 59     cudaStatus = cudaMalloc((void**)&dev_b, size * sizeof(float));
 60     if (cudaStatus != cudaSuccess) {
 61         fprintf(stderr, "cudaMalloc failed!");
 62     }
 63
 64     // Copy input vectors from host memory to GPU buffers.
 65     cudaStatus = cudaMemcpy(dev_a, a, size * sizeof(float), cudaMemcpyHostToDevice);
 66     if (cudaStatus != cudaSuccess) {
 67         fprintf(stderr, "cudaMemcpy failed!");
 68     }
 69
 70     cudaStatus = cudaMemcpy(dev_b, b, size * sizeof(float), cudaMemcpyHostToDevice);
 71     if (cudaStatus != cudaSuccess) {
 72         fprintf(stderr, "cudaMemcpy failed!");
 73     }
 74
 75     // Launch a kernel on the GPU with one thread for each element.
 76     addKernel<<<65535,1024>>>(dev_c, dev_a, dev_b, size);
 77
 78
 79     // Copy output vector from GPU buffer to host memory.
 80     cudaStatus = cudaMemcpy(c, dev_c, size * sizeof(float), cudaMemcpyDeviceToHost);
 81
 82     gfFrametime = g_timer.End( &g_timer );
 83     printf("Time = %f Sec \n", gfFrametime);
 84
 85     float eps = 1e-16;
 86     bool bflag = true;
 87     for (i = 0; i<size; i++)
 88     {
 89         if(abs(c[i] - 2*i)>eps)
 90         {
 91             bflag = false;
 92             break;
 93         }
 94     }
 95     if(bflag)
 96     {
 97         printf("Result OK!\n");
 98     }
 99     else
100     {
101         printf("Result ERROR!\n");
102     }
103 #if 0
104     for (i=0 ; i<5; i++)
105     {
106         printf("c[%d] = %f\n", i, c[i]);
107     }
108     for (i=size-5 ; i<size; i++)
109     {
110         printf("c[%d] = %f\n",i, c[i]);
111     }
112 #endif
113
114     cudaFree(dev_c);
115     cudaFree(dev_a);
116     cudaFree(dev_b);
117
118     free(a);
119     free(b);
120     free(c);
121
122     return 0;
123 }
 1 CUDA_PATH ?=/usr/local/cuda-7.0
 2 NVCC      :=$(CUDA_PATH)/bin/nvcc -ccbin g++
 3 INCLUDE   :=-I/usr/local/cuda-7.0/include/ 4            -I/usr/local/cuda/samples/common/inc 5         -I/usr/include/c++ 6         -I../shareIMLTimer 7         -I./
 8 LINKPATH  :=/usr/lib/
 9 LIBRARIES :=-L/usr/local/cuda/lib64 -lcudart
10 TARGETS   :=CUDAVectorAdd
11 OBJECTS   :=$(addsuffix .o, $(TARGETS))
12 TIMEOBJECTS :=IML_PrecisionTimer.o13                               stimer.o
14
15 .SUFFIXES:.o .cu .cpp
16 .cu.o:
17     $(NVCC) -arch=sm_20  $(INCLUDE) -c -g -o [email protected]  $< $(LIBRARIES)
18 .cpp.o:
19     $(CXX) $(INCLUDE) -c -g -o [email protected] $< $(LIBRARIES)
20
21 all:$(OBJECTS) $(TIMEOBJECTS)
22     #sudo cp /usr/local/cuda/lib64/libcufft.so.7.0 /usr/lib
23     ln -s $(LINKPATH)libcudart.so.7.0  libcudart.so
24     ln -s $(LINKPATH)libcudart.so.7.0  libcudart.so.7
25     g++    $(INCLUDE) -o $(TARGETS) $^ $(LIBRARIES)
26
27 $(TIMEOBJECTS):
28         cd ../shareIMLTimer && make && cp *.o ../$(TARGETS)
29 run:
30     ./$(TARGETS)
31 clean:
32     rm -rf *.o kernel libcudart.so libcudart.so.7 $(TARGETS)

$./CUDAVectorAdd
Time = 0.089507 Sec
Result OK!

时间: 2024-10-27 18:06:48

CUDA Vector Add Test 2048x1024的相关文章

CUDA从入门到精通

CUDA从入门到精通(零):写在前面 在老板的要求下,本博主从2012年上高性能计算课程开始接触CUDA编程,随后将该技术应用到了实际项目中,使处理程序加速超过1K,可见基于图形显示器的并行计算对于追求速度的应用来说无疑是一个理想的选择.还有不到一年毕业,怕是毕业后这些技术也就随毕业而去,准备这个暑假开辟一个CUDA专栏,从入门到精通,步步为营,顺便分享设计的一些经验教训,希望能给学习CUDA的童鞋提供一定指导.个人能力所及,错误难免,欢迎讨论. PS:申请专栏好像需要先发原创帖超过15篇...

cuda多线程间通信

1 #include "cuda_runtime.h" 2 #include "device_launch_parameters.h" 3 4 #include <stdio.h> 5 #include <time.h> 6 #include <stdlib.h> 7 8 #define MAX 120 9 #define MIN 0 10 cudaError_t addWithCuda(int *c, const int *a,

CUDA学习:进一步理解块、线程

1. CUDA里的块和线程概念可以用下面的图来表示: 每个grid里包含可以用二维数组表示的block(块),每个block又包含一个可以用二维数组表示的thread(线程). 2.  二维数组块和线程可以用dim3来定义: dim3 blockPerGrid(3,2); //定义了3*2=6个blocks dim3 threadsPerBlock(3,3);//定义了3*3=9个threads 3. 运行时每个线程的代码,如何知道自己是在哪个块里的哪个线程中运行呢?通过下面的变量计算: * 块

cuda并行计算的几种模式

1 #include "cuda_runtime.h" 2 #include "device_launch_parameters.h" 3 #include <stdio.h> 4 #include <time.h> 5 #include <stdlib.h> 6 7 #define MAX 120 8 #define MIN 0 9 10 cudaError_t addWithCudaStream(int *c, const i

CUDA学习:第一CUDA代码:数组求和

今天有些收获了,成功运行了数组求和代码:就是将N个数相加求和 //环境:CUDA5.0,vs2010 #include "cuda_runtime.h"#include "device_launch_parameters.h" #include <stdio.h> cudaError_t addWithCuda(int *c, int *a); #define TOTALN 72120#define BLOCKS_PerGrid 32#define TH

Cuda learn record two

这是一个cuda 自带的算例,包含cuda 计算的一般流程. 这个地址有比较清楚的cuda的介绍.感谢作者分享(http://blog.csdn.net/hjimce/article/details/51506207) 一般来说,cuda 计算的流程是: 1. 设置显卡编号:cudaSetDevice: 这个主要是在有多个GPU的机器上使用,其编号是从0号开始. 2. 为显卡开辟内存变量: cudaMalloc:使用方法:cudaStatus = cudaMalloc((void**)&dev_

CUDA学习笔记二

简单的向量加 /** * Vector addition: C = A + B. * * This sample is a very basic sample that implements element by element * vector addition. It is the same as the sample illustrating Chapter 2 * of the programming guide with some additions like error checki

CUDA C 编程指导(二):CUDA编程模型详解

CUDA编程模型详解 本文以vectorAdd为例,通过描述C在CUDA中的使用(vectorAdd这个例子可以在CUDA sample中找到.)来介绍CUDA编程模型的主要概念.CUDA C的进一步描述可以参考<Programming Interface>. 主要内容包括: 1.Kernels(核函数) 2.Thread Hierarchy(线程结构) 3.Memory Hierarchy(存储结构) 4.Heterogeneous Programming(异构编程) 5.Compute C

CUDA编程

目录: 1.什么是CUDA 2.为什么要用到CUDA 3.CUDA环境搭建 4.第一个CUDA程序 5. CUDA编程 5.1. 基本概念 5.2. 线程层次结构 5.3. 存储器层次结构 5.4. 运行时API 5.4.1. 初始化 5.4.2. 设备管理 5.4.3. 存储器管理 5.4.3.1. 共享存储器 5.4.3.2. 常量存储器 5.4.3.3. 线性存储器 5.4.3.4. CUDA数组 5.4.4. 流管理 5.4.5. 事件管理 5.4.6. 纹理参考管理 5.4.6.1.