gpt4 book ai didi

c++ - NAPI AsyncWorker:在不使用大 for 的情况下将指针数组转换为 Napi::Array?

转载 作者:太空宇宙 更新时间:2023-11-04 12:40:47 24 4
gpt4 key购买 nike

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

第二个问题:从指针到Napi::Array的转换是在工作线程中ŞnOk还是已经在主线程中了?


第一个问题:我能够解决它,但问题是,有转换,首先我将GPU ArrayFire数组转换为指针,然后我必须创建一个 for,然后创建 Napi::Array,对我来说这看起来不对。有更好的解决方案吗?我能以某种方式为 Napi::Array 使用 pointer 吗???

第二:OnOk 方法我必须执行从ArrayFireNapi 的转换。这是在 OnOk 的主线程上还是仍在工作线程上?因为我必须在 OnOk 中创建 3000 次转换,因为 Env()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();
}

最佳答案

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

关于c++ - NAPI AsyncWorker:在不使用大 for 的情况下将指针数组转换为 Napi::Array?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54307267/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com