利用GPU实现向量数据的相加
2016-11-25 11:00
477 查看
平常的上午,电脑上的程序还没有出结果,就开始自己琢磨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
= { 0 }, b
= { 0 }, c
= { 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;
}
今天还是继续进行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
= { 0 }, b
= { 0 }, c
= { 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;
}
相关文章推荐
- 利用TESLA GPU和MATLAB实现大规模型数据并行处理
- 第一个cuda程序-基于VS2010+CUDA5.0 两个向量相加的GPU实现
- 利用userData实现客户端保存表单数据
- 利用webgrid实现数据的批处理(添加和修改)
- 利用 GROUP BY 和 MAX 实现对表数据分组统计后的过滤查询(Oracle920)
- 利用WebRequest来实现模拟浏览器通过Post方式向服务器提交数据
- 利用webgrid实现数据的批处理(添加和修改)
- 利用ASP实现Oracle数据记录的分页显示
- 利用复制实现数据同步
- 利用存储过程实现交叉表格式数据查询的一种通用方法
- 利用javascript实现可视化数据备份[原创]
- 不同于hibernate,利用通用持久类实现数据增、删、改、查,可极大提高开发效率
- 利用反射原理和IExtenderProvider来实现WebControl与后台类的自动数据交换
- 利用XML数据绑定实现页面无刷新的数据浏览
- 利用剪贴板实现高速导出数据到Excel
- 利用userData实现客户端保存表单数据
- 利用接口灵活实现Excel导入/到出数据功能
- 利用XML数据绑定实现页面无刷新的数据浏览
- 利用数据库复制技术 实现数据同步更新[摘]
- 利用ShareObject实现Flash数据存储