机器学习和生物信息学实验室联盟

标题: CUDA并行编程的一个例子 [打印本页]

作者: xmubingo    时间: 2012-2-29 21:17
标题: CUDA并行编程的一个例子
本帖最后由 xmubingo 于 2012-2-29 21:34 编辑

CUDA ,MPI,Hadoop都是并行运算的工具。
CUDA是基于GPU芯片计算。
简单这么理解。GPU有很多个核(几百个),每个核可以跑一个线程,多个线程组成一个单位叫做

我们可以举个例子:
有三个向量 int a[10], b[10], c[10];
我们要计算a和b的向量之和存放到c中。
一般C语言:
  1. for(int i=0; i<10; i++)
  2.   c[i] = a[i] + b[i];
复制代码
CUDA编程做法:
GPU中的每个线程(核)有一个独立序号叫index,那么只要序号从0到9的线程执行c[index] = a[index] + b[index];就可以实现以上的for循环。
GPU的可贵之处就是,可以并发运行多个线程,相当于一个时间内赋值10次。

  1. ////////////////////////
  2. cuda.cu
  3. ////////////////////////
  4. #include <stdio.h>
  5. #include <cuda_runtime.h>

  6. /* 运行在GPU端的程序 */
  7. __global__ void vectorADD(int* a, int* b, int* c)
  8. {
  9.      int index = threadIdx.x;//获得当前线程的序号
  10.      if(index < blockDim.x)
  11.          c[index] = a[index] + b[index];
  12. }

  13. int main ()
  14. {
  15.         /* 定义10个GPU运算线程 */
  16.         int N = 10;
  17.         
  18.         /* 本地开辟三个数组存放我们要计算的内容 */
  19.         int* h_a = (int*) malloc (N * sizeof(int));
  20.         int* h_b = (int*) malloc (N * sizeof(int));
  21.         int* h_c = (int*) malloc (N * sizeof(int));
  22.         /* 初始化数组A, B和C */
  23.         for(int i=0; i<N; i++)
  24.         {
  25.                 h_a[i] = i;
  26.                 h_b[i] = i;
  27.                 h_c[i] = 0;
  28.         }

  29.         /* 计算10个int型需要的空间 */
  30.         int size = N * sizeof(int);
  31.         
  32.         /* 在GPU上分配同样大小的三个数组 */
  33.         int* d_a;
  34.         int* d_b;
  35.         int* d_c;
  36.         cudaMalloc((void**)&d_a, size);
  37.         cudaMalloc((void**)&d_b, size);
  38.         cudaMalloc((void**)&d_c, size);

  39.         /* 把本地的数组拷贝进GPU内存 */
  40.         cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice);
  41.         cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice);
  42.         cudaMemcpy(d_c, h_c, size, cudaMemcpyHostToDevice);
  43.         
  44.         /* 定义一个GPU运算块 由 10个运算线程组成 */
  45.         dim3 DimBlock = N;
  46.         /* 通知GPU用10个线程执行函数vectorADD */
  47.         vectorADD<<<1, DimBlock>>>(d_a, d_b, d_c);
  48.         /* 将GPU运算完的结果复制回本地 */
  49.         cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);
  50.         
  51.         /* 释放GPU的内存 */
  52.         cudaFree(d_a);
  53.         cudaFree(d_b);
  54.         cudaFree(d_c);

  55.         /* 验证计算结果 */
  56.         for(int j=0; j<N; j++)
  57.                 printf("%d ", h_c[j]);
  58.         printf("\n");
  59. }
复制代码
[attach]482[/attach]
cuda程序以cu为后缀,使用nvcc编译器。用法和gcc有相似之处。

描述有限,希望有兴趣的同学阅读http://datamining.xmu.edu.cn/bbs ... =467&extra=page%3D1 提供的文档。

我们实验室有三块GPU显卡,以及学院的CUDA服务器。设备齐全。有空之余大家多多交流。
作者: zouquan    时间: 2012-2-29 23:18
very goooooooooooood,奖励50元!记账

另外,C太tmd难了,能不能弄个jCUDA的,让我学习一下
作者: xmubingo    时间: 2012-3-1 10:29
zouquan 发表于 2012-2-29 23:18
very goooooooooooood,奖励50元!记账

另外,C太tmd难了,能不能弄个jCUDA的,让我学习一下

Jcuda的Host代码是可以用java写的。但是在gpu端的device代码还是需要用c写。

http://www.jcuda.org/tutorial/TutorialIndex.html

如果需要的话,我可以写个文档。Jcuda的思想是利用java的JNI组件来调用外部的C代码。因此cuda的代码编译仍然需要手动的用nvcc编译。然后才用java程序调用运行。
作者: zouquan    时间: 2012-3-1 19:51
xmubingo 发表于 2012-3-1 10:29
Jcuda的Host代码是可以用java写的。但是在gpu端的device代码还是需要用c写。

http://www.jcuda.org/tu ...

在你上面的代码,哪里是gpu端的?

给定一个矩阵(double[][]),求每两行之间的距离,能不能用jcuda实现?
作者: xmubingo    时间: 2012-3-1 20:31
zouquan 发表于 2012-3-1 19:51
在你上面的代码,哪里是gpu端的?

给定一个矩阵(double[][]),求每两行之间的距离,能不能用jcuda实 ...

/* 运行在GPU端的程序 */
__global__ void vectorADD(int* a, int* b, int* c)
{
     int index = threadIdx.x;//获得当前线程的序号
     if(index < blockDim.x)
         c[index] = a[index] + b[index];
}
这些就是gpu端的代码。

可以用Jcuda实现。
作者: zouquan    时间: 2012-3-1 21:37
xmubingo 发表于 2012-3-1 20:31
/* 运行在GPU端的程序 */
__global__ void vectorADD(int* a, int* b, int* c)
{

可以实现的话就实现一下,陈伟程编了一个hadoop版的,和他的性能比较一下。

这个工作对聚类、生物信息中的进化树构建、基因表达芯片数据分析都有用
作者: xmubingo    时间: 2012-3-2 10:06
zouquan 发表于 2012-3-1 21:37
可以实现的话就实现一下,陈伟程编了一个hadoop版的,和他的性能比较一下。

这个工作对聚类、生物信息 ...

我先写综述。时间太紧。
这里有四篇参考文章,应该不难。
http://blog.csdn.net/xhz1234/article/details/6222010
http://www.cnblogs.com/Fancyboy2 ... /04/28/1445636.html
http://topic.csdn.net/u/20090728 ... 9-2878dd5426d7.html
http://space.itpub.net/23057064/viewspace-676605
作者: zouquan    时间: 2012-3-2 10:51
xmubingo 发表于 2012-3-2 10:06
我先写综述。时间太紧。
这里有四篇参考文章,应该不难。
http://blog.csdn.net/xhz1234/article/detai ...

好,我布置cwc来完成




欢迎光临 机器学习和生物信息学实验室联盟 (http://123.57.240.48/) Powered by Discuz! X3.2