我如何使用cuda与nodejs

时间:2014-01-02 02:27:38

标签: c++ node.js cuda

Cuda是Nivida提供的api,让c / c ++使用gpu来处理某些东西,即使我不知道那些东西是什么&我想知道,从我看到的收益是显着的。 cuda也适用于nivida gpus ......

对于nodejs确实存在一个模块,但它仅适用于64位版本的Windows,但是对于32位版本存在cuda,所以在c ++中只有缺少nodejs到cuda的绑定/扩展。并且在github或互联网上没有关于该模块的任何文件的迹象。最后的提交就像半年前一样。

如果一切皆有可能,那就太棒了。由于nodejs可以使用gpu进行操作,因此将它放在web内容和其他应用程序的全新级别中。同时给出了nodejs的并行特性,它完全符合gpu的并行特性。

假设现在没有模块存在。我有什么选择。

已由其他人完成:http://www.cs.cmu.edu/afs/cs/academic/class/15418-s12/www/competition/r2jitu.com/418/final_report.pdf

2 个答案:

答案 0 :(得分:9)

连接CUDA和Node.js的最自然方式是通过“addon”,它允许您将c ++代码公开给在节点上运行的javascript程序。

Node本身是一个构建在v8 javascript引擎之上的c ++应用程序,而addons是一种编写c ++库的方法,javascript库可以使用它们,与节点自己的库一样。

从外面看,插件看起来就像一个模块。 c ++被编译成动态库,然后像任何其他模块一样暴露给节点。 例如my-addon.cc - &gt; (编译) - &gt; my-addon.dylib - &gt; (node-gyp) - &gt; my-addon.node - &gt; var part1_b:int = (int)(Math.random() * 360); var part1_a:int = 50; var part1_c:int = 0 ; var part1_d:int = null; var part1_tt:int= null; var part1_ti:String= null; if( part1_b >=100) { part1_c=((int)((part1_b-180)/100)*100); } else ( part1_b <= 99) { part1_c=(((int)(part1_b-180)/10)*10); } movieClip_1.addEventListener(Event.ENTER_FRAME, fl_RotateContinuously); function fl_RotateContinuously(event:Event):void { chose(part1_c); if( part1_a>=2){ part1_a--; movieClip_1.rotation+= part1_a; chose(movieClip_1.rotation); }else{ if(movieClip_1.rotation == part1_c) { movieClip_1.rotation == part1_c; word.text = part1_ti; btn_next.visible = true; movieClip_2.visible = false; }else{ movieClip_1.rotation +=1; chose(movieClip_1.rotation); } } } function chose(du:int):void{ if( du>0 && du<=15) { part1_ti = "1";} if( du>15 && du<=30) { part1_ti = "2";} if( du>30 && du<=45) { part1_ti = "3";} if( du>45 && du<=60) { part1_ti = "4";} if( du>60 && du<=75) { part1_ti = "5";} if( du>75 && du<=90) { part1_ti = "6";} if( du>90 && du<=105) { part1_ti = "7";} if( du>105 && du<=120) { part1_ti = "8";} if( du>120 && du<=135) { part1_ti = "9";} if( du>135 && du<=150) { part1_ti = "10";} if( du>150 && du<=165) { part1_ti = "11";} if( du>165 && du<=180) { part1_ti = "12";} if( du>-180 && du<=-165) { part1_ti = "13";} if( du>-165 && du<=-150) { part1_ti = "14";} if( du>-155 && du<=-135) { part1_ti = "15";} if( du>-135 && du<=-120) { part1_ti = "16";} if( du>-120 && du<=-105) { part1_ti = "17";} if( du>-105 && du<=-90) { part1_ti = "18";} if( du>-90 && du<=-75) { part1_ti = "19";} if( du>-75 && du<=-60) { part1_ti = "20";} if( du>-60 && du<=-45) { part1_ti = "21";} if( du>-45 && du<=-30) { part1_ti = "22";} if( du>-30 && du<=-15) { part1_ti = "23";} if( du>-15 && du<=0) { part1_ti = "24";} word.text = part1_ti; } btn_next.addEventListener(MouseEvent.CLICK, fl_ClickToGoToAndStopAtFrame_8); function fl_ClickToGoToAndStopAtFrame_8(event:MouseEvent):void { part1_cont = part1_cont +1; part1_b = null; part1_a = null; part1_c=null ; part1_d =null; part1_tt=null; word.text = ""; gotoAndStop(7); }

从插件内部,您可以使用v8和Node API与Jav​​ascript环境进行交互,并使用普通的c ++ API访问CUDA。

在这个级别上有许多活动部件。简单到将值从一个传递给另一个就意味着当你将javascript值包装/解包到适当的c ++类型时,你需要担心c ++内存管理和javascript垃圾收集器。

好消息是,大多数问题都是单独的,很好的文档和支持库很多,例如nan会立即运行一个骨架插件,而在CUDA方面,你正在谈论他们正常的c ++界面,还有大量的文档和教程。

答案 1 :(得分:8)

执行此操作的正确方法是使用Nvidia CUDA工具包在C ++中编写cuda应用程序,然后将其作为与节点分开的进程调用。通过这种方式,您可以充分利用CUDA并利用节点的强大功能来控制该过程。

例如,如果您有一个cuda应用程序,并且想要将其扩展到32台计算机,则可以使用快速C或C ++编写应用程序,然后使用node将其推送到集群中的所有PC。通过网络处理与每个远程进程的通信。节点在这个区域闪耀。每个CUDA应用程序实例完成它的工作后,您将所有数据与节点连接并将其呈现给用户。