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

 找回密码
 注册

QQ登录

只需一步,快速开始

搜索
查看: 6249|回复: 4
打印 上一主题 下一主题

mapreduce与cuda之我见

[复制链接]
跳转到指定楼层
楼主
发表于 2012-3-9 23:29:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 大宝 于 2012-3-9 23:29 编辑

       过去的两个星期,一星期研究MapReduce,一星期研究CUDA。可以说对这两个并行界的明星有了一点粗浅的认识。在这里我就这两个星期来的所感与大家分享。

框架:     
       在 CUDA 的架构下,一个程序分为两个部份:host 端和 device 端。Host 端是指在 CPU 上执行的部份,而 device 端则是在显示芯片上执行的部份。Device 端的程序又称为 "kernel"。通常 host 端程序会将数据准备好后,复制到显卡的内存中,再由显示芯片执行 device 端程序,完成后再由 host 端程序将结果从显卡的内存中取回。说白了,就是CUP与GPU,内存与显存之间的互动。
        MapReduce的框架大家都已经比较熟悉了。简单来讲,就是分为map操作与reduce操作,每个map对应一行,产生的结果汇总到reduce中进行集中处理。

并行模式:
        CUDA在执行的时候是让host里面的一个一个的kernel按照线程网格(Grid)的概念在显卡硬件(GPU)上执行。每一个线程网格又可以包含多个线程块(block),每一个线程块中又可以包含多个线程(thread)。一个Grid里可以有多个(一般为几万)block,一个block里最多可以有512个thread 。因此理论上CUDA的可并行数是非常多的。
            
         MapReduce的并行模式则更为简单,理论上有多少行就有多少个map,也就有多少个并行单位了。

编程难度:
        CUDA一般使用C编写,MapReduce则使用java。C的编程难度比java大,但是使用CUDA编程时,只要懂得C,基本上就能马上上手了。MapReduce则不然,虽然是用java,但是加了自己的封装,有自己的一套的编程规则,因此在编写程序前还需好好学习。
   
         

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

使用道具 举报

沙发
发表于 2012-3-10 10:25:21 | 只看该作者
本帖最后由 xmubingo 于 2012-3-10 10:39 编辑

顶!!!!

CUDA部分:

关于每个block有多少个thread是由具体GPU的计算能力决定的。在CUDA_C_Programming_Guide4.0中的第158页中描述了不同计算能力的芯片,X,Y,Z方向的最大维数以及block中的最大thread数。

另一个,至于一个网格内有多少个block组成这个问题,在第8页中有解释:
  1. The number of thread blocks in a grid is usually dictated by the size of the data being processed or the number of processors in the system, which it can greatly exceed.
复制代码
意思是和GPU内存有关。具体怎么计算你可以研究下,这个计算我目前还没搞清。

最后一个问题,理论上,一个GPU就一个网格,多个GPU就多个网格。如果有多块GPU怎么实现合并,或者分别访问?这也是个问题。比如236服务器上就有5块显卡。
回复 支持 反对

使用道具 举报

板凳
发表于 2012-3-10 12:43:19 | 只看该作者
很好的技术贴,试用jCUDA了么?
回复 支持 反对

使用道具 举报

地板
 楼主| 发表于 2012-3-10 23:31:51 | 只看该作者
zouquan 发表于 2012-3-10 12:43
很好的技术贴,试用jCUDA了么?

没有试用,因为即使jcuda也要在gpu端使用c,怎么样都逃不过c,所以就c到底了。
回复 支持 反对

使用道具 举报

5#
发表于 2012-3-11 10:49:16 | 只看该作者
本帖最后由 xmubingo 于 2012-3-11 10:59 编辑
大宝 发表于 2012-3-10 23:31
没有试用,因为即使jcuda也要在gpu端使用c,怎么样都逃不过c,所以就c到底了。


先把你目前的C版本整理下代码,尽量节省内存,不要在for里边滥用变量。读取文件时,列数采用手动定义预设值,不需要程序去确认有多少列(不可靠,耗时),一旦发现列数少于或者多于预设值就报错不要继续。

然后尝试下jCUDA,关键是看下能不能成功。参考它的官网:http://www.jcuda.org/

jCUDA不断在被开发,总会有一天变成熟,也保不准cuda以后出java版本。并且至少java调用可以应用到我们的web服务上。所以,你先试试,有问题再一起讨论。
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-5 08:59 , Processed in 0.069799 second(s), 20 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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