如何在nodejs中使用cuda

nszi6y05  于 2023-05-17  发布在  Node.js
关注(0)|答案(4)|浏览(394)

Cuda是Nivida提供的API,它让C/C使用GPU来处理一些东西,尽管我不知道这些东西是什么,也想知道,从我所看到的来看,收益是显着的。另外cuda只适用于nivida gpus。。
确实有一个nodejs模块,但它只适用于64位版本的windows,但也有32位版本的cuda,所以在c
中只缺少nodejs到cuda的绑定/扩展。在github或互联网上没有任何关于该模块的文档。最后一次提交是1/2年前。
如果一切都有可能,那就太好了。因为nodejs将能够使用gpu进行操作,将其置于网络和其他应用程序的全新水平。同时考虑到nodejs的并行特性,它完全符合gpu的并行特性。
假设现在没有模块存在。我的选择是什么。
已经有人做过了http://www.cs.cmu.edu/afs/cs/academic/class/15418-s12/www/competition/r2jitu.com/418/final_report.pdf

7ivaypg9

7ivaypg91#

下面是一个binding.gyp文件,它将使用两个源文件hello.cpp、www.example.com和www.example.com构建节点扩展goodby.cugoodby1.cu

{
  ## 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"
      ],
    }]
  ]
}
]
}
tyky79it

tyky79it2#

正确的方法是使用Nvidia CUDA工具包用C编写cuda应用程序,然后将其作为node的单独进程调用。通过这种方式,您可以从CUDA中获得最大收益,并利用node的强大功能来控制该过程。
例如,如果你有一个cuda应用程序,你想将它扩展到32台计算机,你可以用快速的C或C
编写应用程序,然后使用node将其推送到集群中的所有PC,并通过网络处理与每个远程进程的通信。Node在这个领域大放异彩。一旦每个CUDA应用示例完成其工作,您就可以将所有数据与节点连接并将其呈现给用户。

xnifntxz

xnifntxz3#

连接CUDA和Node.js最自然的方式是通过“addon”,它允许您将c代码暴露给在node上运行的JavaScript程序。
Node本身是一个建立在v8 javascript引擎之上的c
应用程序,而插件是一种让你编写c库的方式,这些库可以被javascript库使用,就像node自己的库一样。
从外部看,插件只是看起来像一个模块。c
被编译成一个动态库,然后像其他模块一样暴露给node。例如:my-addon.cc->(compile)-> my-addon.dylib ->(node-gyp)-> my-addon.node -> var myFoo = require('my-addon').foo()
在插件内部,您可以使用v8和Node API与Javascript环境进行交互,并使用普通的c++ API访问CUDA。
在这一层有很多活动部件。像在一个类型和另一个类型之间传递一个值这样简单的事情意味着,当你将javascript值 Package 到适当的c类型和从适当的c类型中解 Package javascript值时,你需要同时考虑c内存管理和javascript垃圾收集器。
好消息是,大多数问题都很好,有很好的文档和支持库。nan很快就能运行一个 backbone 插件,在CUDA方面,你谈论的是他们正常的C
界面,有大量的文档和教程。

vwkv1x7d

vwkv1x7d4#

截至2021年,一种选择是使用官方的https://github.com/rapidsai/node包,为您提供NVidia RAPIDS工具的Node API,以及在https://developer.nvidia.com/blog/gpu-accelerating-node-js-javascript-for-visualization-and-beyond上找到的相关NVidia开发博客文章。
当然,这不会让你“写cuda代码”,但它可以让你 * 使用 * GPU的cuda核心来做你必须写cuda代码的事情。

相关问题