Доброго дня.
Стоит задача рассчитать значения матрицы 52000 на 52000 на JS.
Значение в каждой ячейке является результатом вычисления Косинусовой близости векторов размерностью 300.
Для ускорения вычислений использую GPUJS:
gpu.addFunction(function mF(a, b) {
return a * b;
});
const f3 = gpu.createKernel(function(inp) {
var a = 0
var b = 0
var c = 0
for (var i = 0; i < 300; i++) {
a += mF(inp[this.thread.y][i], inp[this.thread.x][i])
b += mF(inp[this.thread.y][i], inp[this.thread.y][i])
c += mF(inp[this.thread.x][i], inp[this.thread.x][i])
}
return a / (Math.pow(b, 0.5) * Math.pow(c, 0.5));
}).setOutput([52000, 52000])
Можно ли это оптимизировать?
В среднем на расчет всех косинусовых значений от одного вектора ко всем остальным уходит 7мс (без GPU 36 мс), что составляет почти 6 минут для расчета всей матрицы. Я в JS профан и, скорее всего, не вижу очевидных способов оптимизации кода для ускорения его работы.
Так же скрипт благополучно умирает при расчете всей огромной матрицы, приходится считать кусочками по 1000 векторов.
Спасибо