Cuda是Nivida提供的api,让c / c ++使用gpu来处理某些东西,即使我不知道那些东西是什么&我想知道,从我看到的收益是显着的。 cuda也适用于nivida gpus ......
对于nodejs确实存在一个模块,但它仅适用于64位版本的Windows,但是对于32位版本存在cuda,所以在c ++中只有缺少nodejs到cuda的绑定/扩展。并且在github或互联网上没有关于该模块的任何文件的迹象。最后的提交就像半年前一样。
如果一切皆有可能,那就太棒了。由于nodejs可以使用gpu进行操作,因此将它放在web内容和其他应用程序的全新级别中。同时给出了nodejs的并行特性,它完全符合gpu的并行特性。
假设现在没有模块存在。我有什么选择。
答案 0 :(得分:9)
连接CUDA和Node.js的最自然方式是通过“addon”,它允许您将c ++代码公开给在节点上运行的javascript程序。
Node本身是一个构建在v8 javascript引擎之上的c ++应用程序,而addons是一种编写c ++库的方法,javascript库可以使用它们,与节点自己的库一样。
从外面看,插件看起来就像一个模块。 c ++被编译成动态库,然后像任何其他模块一样暴露给节点。
例如my-addon.cc - > (编译) - > my-addon.dylib - > (node-gyp) - > my-addon.node - > 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与Javascript环境进行交互,并使用普通的c ++ API访问CUDA。
在这个级别上有许多活动部件。简单到将值从一个传递给另一个就意味着当你将javascript值包装/解包到适当的c ++类型时,你需要担心c ++内存管理和javascript垃圾收集器。
好消息是,大多数问题都是单独的,很好的文档和支持库很多,例如nan会立即运行一个骨架插件,而在CUDA方面,你正在谈论他们正常的c ++界面,还有大量的文档和教程。
答案 1 :(得分:8)
执行此操作的正确方法是使用Nvidia CUDA工具包在C ++中编写cuda应用程序,然后将其作为与节点分开的进程调用。通过这种方式,您可以充分利用CUDA并利用节点的强大功能来控制该过程。
例如,如果您有一个cuda应用程序,并且想要将其扩展到32台计算机,则可以使用快速C或C ++编写应用程序,然后使用node将其推送到集群中的所有PC。通过网络处理与每个远程进程的通信。节点在这个区域闪耀。每个CUDA应用程序实例完成它的工作后,您将所有数据与节点连接并将其呈现给用户。