NAPI AsyncWorker:将指针数组转换为Napi :: Array而不使用big for?

时间:2019-01-22 11:27:20

标签: c++ node.js

你好吗?如何在没有Napi::Array的情况下将指针转换为Napi :: Arrray,或者它是最快的呢?

第二个问题:从指针到ȮnOk的转换是工作线程中的GPU ArrayFire array还是已经在主线程中?


第一个问题:我能够解决它,但问题是存在转换,首先将pointer转换为for,然后得到创建Napi::Array,然后创建pointer,对我来说似乎不正确。有更好的解决方案吗?我可以以某种方式将Napi::Array用于OnOk吗???

第二:我必须执行ArrayFire方法从NapiOnOk的转换。是在OnOk的主线程上还是在工作线程上?因为我必须在Env()中创建3000转换,因为Execute方法中OnOk不可用,所以只能在#include <iostream> #include <vector> #include <arrayfire.h> #include <napi.h> #include "test.h" using std::cout; using std::vector; using namespace af; using namespace Napi; #define POINTS 1000 class ArrayTestWorker : public Napi::AsyncWorker { public: ArrayTestWorker(Napi::Function& callback) : Napi::AsyncWorker(callback) { } ~ArrayTestWorker() {} void Execute () { try { // int points = 200; x = randu(POINTS); y = randu(POINTS); z = randu(POINTS); } catch (af::exception& e) { Napi::AsyncWorker::SetError(e.what()); } } void Transform(array& arr, Napi::Array& napiArr) { int count = arr.elements(); float *host_a = arr.host<float>(); cout << "elements: " << count << "\n"; for(int i = 0; i < count; i++) { cout << i << " - i , element: " << host_a[i] << "\n"; napiArr[i] = host_a[i]; } freeHost(host_a); } void OnOK() { Napi::HandleScope scope(Env()); Napi::Object obj = Napi::Object::New(Env()); Napi::Array xArray = Napi::Array::New(Env(), x.elements()); Napi::Array yArray = Napi::Array::New(Env(), y.elements()); Napi::Array zArray = Napi::Array::New(Env(), z.elements()); Transform(x, xArray); Transform(y, yArray); Transform(z, zArray); obj.Set("x-length", x.elements()); obj.Set("y-length", y.elements()); obj.Set("z-length", z.elements()); obj.Set("x", xArray); obj.Set("y", yArray); obj.Set("z", zArray); Callback().Call({Env().Undefined(), obj}); } private: array x; array y; array z; }; Napi::Value ArrayFireTestAsync(const Napi::CallbackInfo& info) { //int points = info[0].As<Napi::Number>().Uint32Value(); Napi::Function callback = info[0].As<Napi::Function>(); ArrayTestWorker* testWorker = new ArrayTestWorker(callback); testWorker->Queue(); return info.Env().Undefined(); } 上使用,我不想阻止该事件循环...

from IPython.display import SVG
from keras.utils import model_to_dot

SVG(model_to_dot(model).create(prog='dot', format='svg'))

1 个答案:

答案 0 :(得分:0)

实际上,没有办法将缓冲区用作数组。我的意思是,它将使用float的ArrayBuffer,但是随后您必须在NodeJs中进行转换才能从缓冲区转换为数组,因此最快的转换是在纯C ++上并使用循环。