引入gpu.js:GPU加速JavaScript

做不可能的事情很有趣。

引入gpu.js:GPU加速JavaScript
gpu.rocks

S 0,这里的问题:你是一个厨师,你已被要求对你最好的朋友的婴儿沐浴准备奶昔。 由于厨师的收入通常很高,因此您是圆柱形自动变压器( CAT )的骄傲的所有者,您可以用它来制作奶昔等。

选择1:您可以自己制作奶昔,这需要2分钟的时间

选项2:无论请求如何,您都可以使用CAT ,这大约需要20分钟

您选择: 选项1 (不错的选择)

您在厨房里的速度给您留下深刻的印象,鲸鱼皇后要求您在儿子的婚礼上做一道八道菜的晚餐,包括开胃菜,甜点和奶昔。

如果您现在选择自己一个人去做,不仅不仅无法完成工作,而且一生都将被禁止捕鲸和王国。 但是,如果您对Math不太了解,可以选择CAT,在20分钟内完成工作(对!?!),并获得英国最豪华酒店的所有通行证。

机器学习是八道菜的晚餐,是在鲸鱼王子与200,000位客人的盛宴中举办的。 您想自己做饭(CPU)还是使用服务? 提示: gpu.js是该服务。)

机器学习中, GPU可以帮助您将时间缩短为原始时间的1/100。 甚至更多。 (继续!结果将显示出来。)

介绍gpu.js!

如果您不知所措,并且想直接进入括号中 ,请随时跳到下一部分。

gpu.js是一个GPGPU(图形处理单元上的通用编程)库,可让您将大量计算移交给GPU,以实现超快速的操作和输出。 它当前在浏览器和node.js上运行,其中正在浏览器中使用WebGl API,并对node.js进行单线程操作。 OpenCL正在发展中。(????)

引入gpu.js:GPU加速JavaScript
Github星⭐️

您可能会问:“但是为什么呢? 英特尔的i7或i9不够快吗? 他们似乎对我来说很好。 我不需要这个。”

在陷入困境之前,请查看结果:

引入gpu.js:GPU加速JavaScript
MacBook Pro Retina 2015,谷歌浏览器
22.97倍!?!

规格 :MacBook Pro Retina ,2015年)

是的是的! 这是一台功能强大的机器,因此,这是带有集成显卡( Intel HD 3000 )且没有专用GPU的系统上的结果:

引入gpu.js:GPU加速JavaScript
英特尔HD 3000,谷歌浏览器

总而言之,将gpu.js分开的gpu.js在于,它不会以特定方式链接您使用该库。 它能达到标语所说的:它使您可以加速庞大的JavaScript。

现在让我们有一些代码:我们将执行矩阵乘法,并测试CPU与GPU的性能。 矩阵大小: 512 X 512

你是对的。 它托管在GitHub上: gpu.js-demo

可以从我们的网站( gpu.rocks )或github( gpu.js )下载源文件gpu.min.jsgpu-core.min.js

注意:我假设您已经初始化了一个原型HTML / JS / CSS项目( index.htmlindex.jsstyle.css

步骤1.导入gpu lib文件

在index.html中,导入文件,一切顺利:

步骤2. CPU上的矩阵乘法

若要将两个矩阵相乘,我们需要确保第一个矩阵中的列数等于第二个矩阵中的行数。

矩阵A: 512 X 512 (m X n)

矩阵B: 512 X 512 (n X r)

结果: 512 X 512 (m X r)

这是在CPU上运行的通用矩阵乘法算法:

下一步就是魔术的开始。 (WebGL魔术????)

步骤3.设定GPU

lib文件将导出名为GPU的全局函数,可用于创建新的gpu实例。 一个GPU

const gpu = new GPU({mode: 'webgl'});

可以向构造函数发送一些选项,可以在GitHub和自动生成的JSDocs上找到其完整列表。

mode选项指定函数将在何处运行。 共有三个选项:

  1. “ gpu”
  2. “ webgl”
  3. “中央处理器”

gpu和webgl暂时是别​​名。 我们的目标是将OpenCL集成到v2 ,然后gpu仅意味着通过服务器上的OpenCL API使用gpu。

当前,webgl和gpu都使用WebGL API将工作推迟到GPU。

步骤4. GPU上的矩阵乘法

我们刚刚初始化的gpu变量具有几个附加的方法,所有这些方法都有不同的用例。

我们将使用createKernel方法,该方法本质上会创建一个可从JS调用的“内核”(实际上,它的抽象术语可能是function )。 在幕后,您的代码将使用AST和基于jison的解析器编译为GLSL着色器。 这样可以确保内核中编写的代码将在GPU上执行。

您将JS函数作为参数传递给内核,并可以访问线程尺寸(作为一种助记符,您可以将线程尺寸视为我们在CPU模式下使用的for循环的长度。)

.setDimensions设置循环的尺寸。 (有关完整参考,请参见API页面。)

在大多数GPU编写的软件中,这是一个固有的问题: Transfer Penalty GPU就像自己的计算机一样。 我们从CPU发送命令到的黑匣子。 我们可以将其传输到其中并从中读取数据,但是这一切都会带来损失。 如果您的案例涉及在GPU上执行几次数学运算,并且每次操作的净罚款不断增加,则转移的总体代价尤其会成为瓶颈。

但是,您可以将值保留在GPU上。 它们作为纹理存在于GPU上。 (您可以将Textures视为某种数据容器,但是对于GPU而言。)通过将outputToTexture标志设置为true ,可以确保不招致传输损失,从而获得了重要的速度outputToTexture

.setOutputToTexture真正的 .setOutputToTexture发生的地方!

引入gpu.js:GPU加速JavaScript
WiffleGif.com

就像它们一样重要,AB是我们将在下一步中创建的矩阵。

步骤5.初始化矩阵

该代码取自您在我们的网站上看到的演示。 如果您不明白,那没问题。 它的作用是:它向JavaScript数组添加512 * 512个元素。 1D ),然后将它们分为512个部分,这意味着最后我们有了一个大小为512 * 5122D数组。 (每个数组元素都有子元素。)

全做完了! 让我们加油吧。

第6步。运行它并进行基准测试

为简单起见,我们将使用Web性能API对此进行基准测试,但您也可以使用benchmark.js (我们的网站使用它。)

首先,我们通过调用上述函数来生成矩阵,然后针对CPUGPU都运行matMult方法。

AM! 在浏览器中打开index.html并亲自查看。 这是我得到的:(即将支持Safari !)

铬:

引入gpu.js:GPU加速JavaScript

Firefox(最新消息, Chrome? ):

引入gpu.js:GPU加速JavaScript

而这仅仅是512×512。如果你改变这个数字到1024,你会发现,GPU是一个功能强大的野兽,可以比CPU多快很多运行代码。

我们想让社区知道JavaScript被赋予了火箭的天赋。 will您将如何处理?

引入gpu.js:GPU加速JavaScript

所有代码都在GitHub上,团队将很高兴拥有更多的用户和贡献者。 gpu.js —来一些顿悟。 ????

引入gpu.js:GPU加速JavaScript

From: https://hackernoon.com/introducing-gpu-js-gpu-accelerated-javascript-ba11a6069327