利用GPU实现向量数据的相加
来源:互联网 发布:手机装软件 编辑:程序博客网 时间:2024/06/08 18:40
平常的上午,电脑上的程序还没有出结果,就开始自己琢磨CUDA的编程,其实跟人说的时候有些表意不清,有些想说的话感觉总是说不切意,还是写下来比较好。
今天还是继续进行CUDA的编程时间,主要的目的是利用GPU实现两个数组数据的相加的初级练习:
代码思想: 1.首先需要利用__global__ 定义一个在GPU里面运行的add()函数
2.blockidx.d 定义一个一维block 具体参考 http://www.cnblogs.com/viviman/archive/2012/11/28/2792521.html ,这个等深入的了解GPU结构可以了解清楚
3.接下来需要在Host 和Device上分别的开辟相应的数组空间,进行数据的存储;
4.利用for循环创建数组数据,并通过 cudaMemcpy 复制到Device上, cudaMemcpy(dev_a, a, N*sizeof(int), cudaMemcpyHostToDevice); 第一个参数是目标,第二个参数是源,第三个参数是总体的数据量大小,第四个参数是复制的步骤指令,将数据从Host(主机)到Device(设备);
5.调用add<<<>>>函数进行运算
6. 运算完毕,cudaMemcpy(c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost); // GPU pass the result to Host
7.释放一下Device上的空间。
初学注意点: 1.复制的方向不能配置错误
2.设计到GPU内部的线程,块的分配先只做了解。
//----------------------------------------------//
// CUDA code practice //
// Aim : Sum the vector in GPU //
// 24/11/2016 //
// ychjiang //
// jiang__yunchao@163.com //
//--------------------------------------------//
//--------------------------------------------//
//
// //
#include <iostream>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#define N 50
__global__ void add(int *a, int *b, int *c)
{
int tid = blockIdx.x;
if (tid < N)
{
c[tid] = a[tid] + b[tid];
}
}
int main()
{
int a[N] = { 0 }, b[N] = { 0 }, c[N] = { 0 }; //CPU
int *dev_a=0, *dev_b=0, *dev_c=0; //GPU
cudaMalloc(&dev_a, sizeof(int)*N); //GPU allocate a memory
cudaMalloc(&dev_b, sizeof(int)*N);
cudaMalloc(&dev_c, sizeof(int)*N);
for (int i = 1; i < N; i++)
{
a[i] = i;
b[i] = i*i*i; //set value of array
}
cudaMemcpy(dev_a, a, N*sizeof(int), cudaMemcpyHostToDevice); // GPU copy the data form CPU
cudaMemcpy(dev_b, b, N*sizeof(int), cudaMemcpyHostToDevice); // GPU copy the data form CPU
cudaMemcpy(dev_c, c, N*sizeof(int), cudaMemcpyHostToDevice); // GPU copy the data form CPU
add << <N, 1 >> >(dev_a, dev_b, dev_c); //GPU add
cudaMemcpy(c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost); // GPU pass the result to Host
for (int i = 1; i < N; i++)
{
printf("%d + %d\t=%d\t\n", a[i], b[i], c[i]); //output result
}
cudaFree(dev_a); // free the GPUs
cudaFree(dev_b);
cudaFree(dev_c);
return 0;
}
- 利用GPU实现向量数据的相加
- 第一个cuda程序-基于VS2010+CUDA5.0 两个向量相加的GPU实现
- 第一个基于GPU CUDA的程序--向量相加的并行处理
- 利用位向量实现海量数据存储
- 利用单链表实现多相式的相加
- 利用D3DQUERY实现简单的GPU计时器
- 利用GPU 实现翻页
- A CUDA Support Vector Machine Implementation 利用GPU的CUDA改进支持向量机SVM
- (五)利用GPU计算整数相加 CUDA
- 利用D3D抓取GPU数据
- 利用D3D抓取GPU数据
- 利用D3D抓取GPU数据
- 利用单链表实现一元多项式的表示及相加
- [菜鸟每天来段CUDA_C]向量相加的CUDA实现和顺序执行比较
- 利用GPU实现通用计算
- 利用GPU实现Matlab加速
- 利用GPU实现翻页效果
- EMU8086 简单汇编程序&实现5个BYTES的数据相加
- (转) 正则表达式大全,手机、电话、邮箱、身份证(最严格的验证)、IP地址、网址、日期
- 约瑟夫环求解O(n)
- Linux中系统中QtCreater引用第三方库文件
- 将php返回的二维数组赋值给js中的二维数组
- 通过这次季度报告,分享近况
- 利用GPU实现向量数据的相加
- 置换(Leonardo's Notebook,LA 3641)
- 前端XSS攻击的三种方式
- Struts2.5 提示:ERROR ParametersInterceptor Developer Notification 原因解释
- Android JNI编程(五)——C语言的静态内存分配、动态内存分配、动态创建数组
- 如何依照自己的意愿隐藏和显示页面上的元素
- IARPA的量子计算机研发计划
- 跨平台Socket封装——CSocketImpl类
- Python写一个小小的项目监控