如何在Node.js中使用CUDA

12
Cuda是由Nvidia提供的API,它允许c/c++使用gpu完成某些任务,尽管我不知道这些任务是什么,也想了解一下,从我看到的情况来看,收益非常显著。此外,Cuda只适用于Nvidia gpu...
Nodejs确实存在一个模块,但它只适用于64位版本的Windows,然而32位版本的cuda也存在,所以唯一缺少的就是将nodejs与cuda在c++中绑定/扩展。Github或互联网上没有关于该模块的文档。最后提交的时间大约在1/2年前。
如果可能的话,那将非常棒。因为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
试试看这个 链接 上的 Node.JS 扩展。它提供了 OpenCL 绑定,不是 CUDA,但可能更好,因为它还支持 ATI/AMD 显卡。 - aland
无论我做什么,似乎都无法在我的电脑上安装WebCL工作...它只是进入node-gyp重建,然后停止,但当我运行示例文件时,它会显示找不到WebCL模块...真让人沮丧。 - Muhammad Umer
2
很不幸,所有的Motorola Mobility github账户都被删除了。但是在https://github.com/mikeseven/node-webcl上似乎有一个分支。 - JasonCG
1
这是一个绑定到CUDA的示例Node本地插件:https://github.com/kashif/node-cuda - ZachB
4个回答

13

这里是一个binding.gyp文件,它将使用两个源文件hello.cpp、goodby.cu和goodby1.cu构建一个Node扩展。

{
  ## for windows, be sure to do node-gyp rebuild -msvs_version=2013, 
  ## and run under a msvs shell

  ## for all targets 
  'conditions': [
    [ 'OS=="win"', {'variables': {'obj': 'obj'}}, 
    {'variables': {'obj': 'o'}}]],

  "targets": [
{
 "target_name": "hello",
 "sources": [ "hello.cpp", "goodby.cu", "goodby1.cu",], 

 'rules': [{
     'extension': 'cu',           
     'inputs': ['<(RULE_INPUT_PATH)'],
     'outputs':[ '<(INTERMEDIATE_DIR)/<(RULE_INPUT_ROOT).<(obj)'],
     'conditions': [
      [ 'OS=="win"',  
        {'rule_name': 'cuda on windows',
         'message': "compile cuda file on windows",
         'process_outputs_as_sources': 0,
         'action': ['nvcc -c <(_inputs) -o  <(_outputs)'],
         }, 
       {'rule_name': 'cuda on linux',
         'message': "compile cuda file on linux",
         'process_outputs_as_sources': 1,
         'action': ['nvcc','-Xcompiler','-fpic','-c',
            '<@(_inputs)','-o','<@(_outputs)'],
    }]]}],

   'conditions': [
    [ 'OS=="mac"', {
      'libraries': ['-framework CUDA'],
      'include_dirs': ['/usr/local/include'],
      'library_dirs': ['/usr/local/lib'],
    }],
    [ 'OS=="linux"', {
      'libraries': ['-lcuda', '-lcudart'],
      'include_dirs': ['/usr/local/include'],
      'library_dirs': ['/usr/local/lib', '/usr/local/cuda/lib64'],
    }],
    [ 'OS=="win"', {
      'conditions': [
        ['target_arch=="x64"',
          {
            'variables': { 'arch': 'x64' }
          }, {
            'variables': { 'arch': 'Win32' }
          }
        ],
      ],
      'variables': {
        'cuda_root%': '$(CUDA_PATH)'
      },
      'libraries': [
        '-l<(cuda_root)/lib/<(arch)/cuda.lib',
        '-l<(cuda_root)/lib/<(arch)/cudart.lib',
      ],
      "include_dirs": [
        "<(cuda_root)/include",
      ],
    }, {
      "include_dirs": [
        "/usr/local/cuda/include"
      ],
    }]
  ]
}
]
}

10
最自然的将CUDA和Node.js连接起来的方法是通过"addon",这允许您将C++代码暴露给在Node上运行的JavaScript程序。
Node本身是一个建立在v8 JavaScript引擎之上的C ++应用程序,并且addon是一种让您编写C ++库的方式,这些库可以像Node自己的库一样由JavaScript库使用。
从外部看,addon看起来只是一个模块。 C ++会被编译成动态库,然后像任何其他模块一样暴露给Node。 例如my-addon.cc ->(编译)-> my-addon.dylib ->(node-gyp)-> my-addon.node -> var myFoo = require('my-addon').foo() 从插件内部,您可以使用v8和Node API与JavaScript环境进行交互,并使用普通的C ++ API访问CUDA。
在这个级别下有很多东西正在运转。 就算仅仅是在不同模块间传递值,也需要同时考虑到C ++内存管理和JavaScript垃圾回收器,同时包装/解包JavaScript值以及相应的C ++类型。
好消息是,大部分问题都可以单独处理,有许多文档和支持库,例如nan可以让骨架addon快速运行,并且对于CUDA方面,您可以使用普通的C ++接口,有大量的文档和教程。

10

正确的方法是使用Nvidia CUDA工具包在C++中编写您的cuda应用程序,然后作为单独的进程从节点中调用它。这样,您可以充分利用CUDA的功能,并利用节点的能力来控制该过程。

例如,如果您有一个cuda应用程序,并且想将其扩展到32台计算机,则可以使用快速的C或C++编写该应用程序,然后使用节点将其推送到集群中的所有PC,并通过网络处理每个远程进程之间的通信。在此领域,节点表现出色。一旦每个CUDA应用程序实例完成其工作,您就可以使用节点将所有数据合并,并呈现给用户。


那么你打算如何使用CUDA呢?你仍然需要用C语言编写你的CUDA代码。因此,最好的方法是在C语言中编写将使用CUDA的整个算法,然后将其作为单独的程序从节点调用。 - Martin
1
尽管这不是人们想要阅读的答案,但现在这可能是唯一现实的答案。这也是我们公司的做法。我们从节点到用Python编写的软件进行通信。该软件只是作为CLI应用程序编写的,我们的Node.js应用程序使用stdin/stdout来交换数据。 - bvdb

1

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接