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

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 15168|回复: 7
打印 上一主题 下一主题

CUDA并行编程的一个例子

  [复制链接]
跳转到指定楼层
楼主
发表于 2012-2-29 21:17:35 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
本帖最后由 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. }
复制代码

cuda程序以cu为后缀,使用nvcc编译器。用法和gcc有相似之处。

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

我们实验室有三块GPU显卡,以及学院的CUDA服务器。设备齐全。有空之余大家多多交流。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x
分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏 转播转播 分享分享
回复

使用道具 举报

8#
发表于 2012-3-2 10:51:07 | 只看该作者
xmubingo 发表于 2012-3-2 10:06
我先写综述。时间太紧。
这里有四篇参考文章,应该不难。
http://blog.csdn.net/xhz1234/article/detai ...

好,我布置cwc来完成
回复 支持 反对

使用道具 举报

7#
 楼主| 发表于 2012-3-2 10:06:47 | 只看该作者
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
回复 支持 反对

使用道具 举报

6#
发表于 2012-3-1 21:37:55 | 只看该作者
xmubingo 发表于 2012-3-1 20:31
/* 运行在GPU端的程序 */
__global__ void vectorADD(int* a, int* b, int* c)
{

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

这个工作对聚类、生物信息中的进化树构建、基因表达芯片数据分析都有用
回复 支持 反对

使用道具 举报

5#
 楼主| 发表于 2012-3-1 20:31:15 | 只看该作者
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实现。
回复 支持 反对

使用道具 举报

地板
发表于 2012-3-1 19:51:17 | 只看该作者
xmubingo 发表于 2012-3-1 10:29
Jcuda的Host代码是可以用java写的。但是在gpu端的device代码还是需要用c写。

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

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

给定一个矩阵(double[][]),求每两行之间的距离,能不能用jcuda实现?
回复 支持 反对

使用道具 举报

板凳
 楼主| 发表于 2012-3-1 10:29:21 | 只看该作者
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程序调用运行。
回复 支持 反对

使用道具 举报

沙发
发表于 2012-2-29 23:18:23 | 只看该作者
very goooooooooooood,奖励50元!记账

另外,C太tmd难了,能不能弄个jCUDA的,让我学习一下
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

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

GMT+8, 2025-4-5 15:31 , Processed in 0.072983 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表