使用GPU.js改善JavaScript性能

你是否曾經嘗試過運行復雜的計算,卻發現它須要花費很長時間,而且拖慢了你的進程?javascript

有不少方法能夠解決這個問題,例如使用web worker或後臺線程。GPU減輕了CPU的處理負荷,給了CPU更多的空間來處理其餘進程。同時,web worker仍然運行在CPU上,可是運行在不一樣的線程上。java

在該初學者指南中,咱們將演示如何使用GPU.js執行復雜的數學計算並提升JavaScript應用的性能。git

什麼是GPU.js?

GPU.js是一個針對Web和Node.js構建的JavaScript加速庫,用於在圖形處理單元(GPGPU)上進行通用編程,它使你能夠將複雜且耗時的計算移交給GPU而不是CPU,以實現更快的計算和操做。還有一個備用選項:在系統上沒有GPU的狀況下,這些功能仍將在常規JavaScript引擎上運行。github

當你要執行復雜的計算時,實質上是將這種負擔轉移給系統的GPU而不是CPU,從而增長了處理速度和時間。web

高性能計算是使用GPU.js的主要優點之一。若是你想在瀏覽器中進行並行計算,而不瞭解WebGL,那麼GPU.js是一個適合你的庫。shell

爲何要使用GPU.js

爲何要使用GPU執行復雜的計算的緣由不勝枚舉,有太多的緣由沒法在一篇文章中探討。如下是使用GPU的一些最值得注意的好處。npm

  • GPU可用於執行大規模並行GPGPU計算。這是須要異步完成的計算類型
  • 當系統中沒有GPU時,它會優雅地退回到JavaScript
  • GPU當前在瀏覽器和Node.js上運行,很是適合經過大量計算來加速網站
  • GPU.js是在考慮JavaScript的狀況下構建的,所以這些功能均使用合法的JavaScript語法

若是你認爲你的處理器能夠勝任,你不須要GPU.js,看看下面這個GPU和CPU運行計算的結果。編程

如你所見,GPU比CPU快22.97倍。數組

GPU.js的工做方式

考慮到這種速度水平,JavaScript生態系統彷彿獲得了一個能夠乘坐的火箭。GPU能夠幫助網站更快地加載,特別是必須在首頁上執行復雜計算的網站。你再也不須要擔憂使用後臺線程和加載器,由於GPU運行計算的速度是普通CPU的22.97倍。瀏覽器

gpu.createKernel 方法建立了一個從JavaScript函數移植過來的GPU加速內核。

與GPU並行運行內核函數會致使更快的計算速度——快1-15倍,這取決於你的硬件。

GPU.js入門

爲了展現如何使用GPU.js更快地計算複雜的計算,讓咱們快速啓動一個實際的演示。

安裝

sudo apt install mesa-common-dev libxi-dev  // using Linux

npm

npm install gpu.js --save
// OR
yarn add gpu.js

在你的Node項目中要導入GPU.js。

import { GPU } from ('gpu.js')

// OR
const { GPU } = require('gpu.js')

const gpu = new GPU();

乘法演示

在下面的示例中,計算是在GPU上並行完成的。

首先,生成大量數據。

const getArrayValues = () => {

  // 在此處建立2D arrary
  const values = [[], []]

  // 將值插入第一個數組
  for (let y = 0; y < 600; y++){
    values[0].push([])
    values[1].push([])

    // 將值插入第二個數組
    for (let x = 0; x < 600; x++){
      values\[0\][y].push(Math.random())
      values\[1\][y].push(Math.random())
    }
  }

  // 返回填充數組
  return values
}

建立內核(運行在GPU上的函數的另外一個詞)。

const gpu = new GPU();

// 使用 `createKernel()` 方法將數組相乘
const multiplyLargeValues = gpu.createKernel(function(a, b) {
  let sum = 0;
  for (let i = 0; i < 600; i++) {
    sum += a\[this.thread.y\][i] * b\[i\][this.thread.x];
  }
  return sum;
}).setOutput([600, 600])

使用矩陣做爲參數調用內核。

const largeArray = getArrayValues()
const out = multiplyLargeValues(largeArray[0], largeArray[1])

輸出

console.log(out\[y\][x]) // 將元素記錄在數組的第x行和第y列
console.log(out\[10\][12]) // 記錄輸出數組第10行和第12列的元素

運行GPU基準測試

你能夠按照GitHub上指定的步驟運行基準測試。

npm install @gpujs/benchmark

const benchmark = require('@gpujs/benchmark')

const benchmarks = benchmark.benchmark(options);

options 對象包含能夠傳遞給基準的各類配置。

前往GPU.js官方網站查看完整的計算基準,這將幫助你瞭解使用GPU.js進行復雜計算能夠得到多少速度。

結束

在本教程中,咱們詳細探討了GPU.js,分析了它的工做原理,並演示瞭如何進行並行計算。咱們還演示瞭如何在你的Node.js應用中設置GPU.js。


原文:https://blog.zhangbing.site

相關文章
相關標籤/搜索