Lably
Skip to content

WebCL

Software

  • 6 min read
  • 4 chapters

Related on Lably

Through JavaScript, Web browser and Augmented reality

Implementation

Currently, no browsers natively support WebCL. However, non-native add-ons are used to implement WebCL. For example, Nokia developed a WebCL extension. Mozilla does not plan to implement WebCL in favor of WebGL Compute Shaders, which were in turn scrapped in favor of WebGPU.

  • Mozilla (Firefox) - hg.mozilla.org/projects/webcl/ Archived 2016-03-03 at the Wayback Machine

WebCL working draft

  • Samsung (WebKit) - github.com/SRA-SiliconValley/webkit-webcl Archived 2014-08-01 at the Wayback Machine
  • Nokia (Firefox) - github.com/toaarnio/webcl-firefox (last Version for Firefox 34) Archived 2018-06-11 at the Wayback Machine
  • Intel (Crosswalk) - www.crosswalk-project.org Archived 2013-09-27 at the Wayback Machine

Example C code

The basic unit of a parallel program is kernel. A kernel is any parallelizable task used to perform a specific job. More often functions can be realized as kernels. A program can be composed of one or more kernels. In order to realize a kernel, it is essential that a task is parallelizable. Data dependencies and order of execution play a vital role in producing efficient parallelized algorithms. A simple example can be thought of the case of loop unrolling performed by C compilers, where a statement like:

<span id="mwTA"></span><span class="k" id="mwTQ">for</span><span class="w" id="mwTg"> </span><span class="p" id="mwTw">(</span><span class="n" id="mwUA">i</span><span class="w" id="mwUQ"> </span><span class="o" id="mwUg">=</span><span class="w" id="mwUw"> </span><span class="mi" id="mwVA">0</span><span class="p" id="mwVQ">;</span><span class="w" id="mwVg"> </span><span class="n" id="mwVw">i</span><span class="o" id="mwWA"><</span><span class="w" id="mwWQ"> </span><span class="mi" id="mwWg">3</span><span class="w" id="mwWw"> </span><span class="p" id="mwXA">;</span><span class="w" id="mwXQ"> </span><span class="n" id="mwXg">i</span><span class="o" id="mwXw">++</span><span class="p" id="mwYA">)</span> <span class="w" id="mwYQ"> </span><span class="n" id="mwYg">c</span><span class="p" id="mwYw">[</span><span class="n" id="mwZA">i</span><span class="p" id="mwZQ">]</span><span class="w" id="mwZg"> </span><span class="o" id="mwZw">=</span><span class="w" id="mwaA"> </span><span class="n" id="mwaQ">a</span><span class="p" id="mwag">[</span><span class="n" id="mwaw">i</span><span class="p" id="mwbA">]</span><span class="w" id="mwbQ"> </span><span class="o" id="mwbg">+</span><span class="w" id="mwbw"> </span><span class="n" id="mwcA">b</span><span class="p" id="mwcQ">[</span><span class="n" id="mwcg">i</span><span class="p" id="mwcw">];</span>

can be unrolled into:

<span id="mwdw"></span><span class="n" id="mweA">c</span><span class="p" id="mweQ">[</span><span class="mi" id="mweg">0</span><span class="p" id="mwew">]</span><span class="w" id="mwfA"> </span><span class="o" id="mwfQ">=</span><span class="w" id="mwfg"> </span><span class="n" id="mwfw">a</span><span class="p" id="mwgA">[</span><span class="mi" id="mwgQ">0</span><span class="p" id="mwgg">]</span><span class="w" id="mwgw"> </span><span class="o" id="mwhA">+</span><span class="w" id="mwhQ"> </span><span class="n" id="mwhg">b</span><span class="p" id="mwhw">[</span><span class="mi" id="mwiA">0</span><span class="p" id="mwiQ">];</span> <span class="n" id="mwig">c</span><span class="p" id="mwiw">[</span><span class="mi" id="mwjA">1</span><span class="p" id="mwjQ">]</span><span class="w" id="mwjg"> </span><span class="o" id="mwjw">=</span><span class="w" id="mwkA"> </span><span class="n" id="mwkQ">a</span><span class="p" id="mwkg">[</span><span class="mi" id="mwkw">1</span><span class="p" id="mwlA">]</span><span class="w" id="mwlQ"> </span><span class="o" id="mwlg">+</span><span class="w" id="mwlw"> </span><span class="n" id="mwmA">b</span><span class="p" id="mwmQ">[</span><span class="mi" id="mwmg">1</span><span class="p" id="mwmw">];</span> <span class="n" id="mwnA">c</span><span class="p" id="mwnQ">[</span><span class="mi" id="mwng">2</span><span class="p" id="mwnw">]</span><span class="w" id="mwoA"> </span><span class="o" id="mwoQ">=</span><span class="w" id="mwog"> </span><span class="n" id="mwow">a</span><span class="p" id="mwpA">[</span><span class="mi" id="mwpQ">2</span><span class="p" id="mwpg">]</span><span class="w" id="mwpw"> </span><span class="o" id="mwqA">+</span><span class="w" id="mwqQ"> </span><span class="n" id="mwqg">b</span><span class="p" id="mwqw">[</span><span class="mi" id="mwrA">2</span><span class="p" id="mwrQ">];</span>

Above statements can be parallelized and can be made to run simultaneously. A kernel follows a similar approach where only the snapshot of the ith iteration is captured inside kernel.

Rewriting the above code using a kernel:

<span id="mwsw"></span><span class="n" id="mwtA">__kernel</span><span class="w" id="mwtQ"> </span><span class="nf" id="mwtg">add</span><span class="p" id="mwtw">(</span><span class="n" id="mwuA">__global</span><span class="w" id="mwuQ"> </span><span class="kt" id="mwug">float</span><span class="o" id="mwuw">*</span><span class="w" id="mwvA"> </span><span class="n" id="mwvQ">a</span><span class="p" id="mwvg">,</span><span class="w" id="mwvw"> </span><span class="n" id="mwwA">__global</span><span class="w" id="mwwQ"> </span><span class="kt" id="mwwg">float</span><span class="o" id="mwww">*</span><span class="w" id="mwxA"> </span><span class="n" id="mwxQ">b</span><span class="p" id="mwxg">,</span><span class="w" id="mwxw"> </span><span class="n" id="mwyA">__global</span><span class="w" id="mwyQ"> </span><span class="kt" id="mwyg">float</span><span class="o" id="mwyw">*</span><span class="n" id="mwzA">c</span><span class="p" id="mwzQ">)</span> <span class="p" id="mwzg">{</span> <span class="w" id="mwzw"> </span><span class="kt" id="mw0A">int</span><span class="w" id="mw0Q"> </span><span class="n" id="mw0g">i</span><span class="w" id="mw0w"> </span><span class="o" id="mw1A">=</span><span class="w" id="mw1Q"> </span><span class="n" id="mw1g">get_global_id</span><span class="p" id="mw1w">(</span><span class="mi" id="mw2A">0</span><span class="p" id="mw2Q">);</span> <span class="w" id="mw2g"> </span><span class="k" id="mw2w">if</span><span class="w" id="mw3A"> </span><span class="p" id="mw3Q">(</span><span class="n" id="mw3g">i</span><span class="o" id="mw3w"><</span><span class="mi" id="mw4A">3</span><span class="p" id="mw4Q">)</span> <span class="w" id="mw4g"> </span><span class="n" id="mw4w">c</span><span class="p" id="mw5A">[</span><span class="n" id="mw5Q">i</span><span class="p" id="mw5g">]</span><span class="w" id="mw5w"> </span><span class="o" id="mw6A">=</span><span class="w" id="mw6Q"> </span><span class="n" id="mw6g">a</span><span class="p" id="mw6w">[</span><span class="n" id="mw7A">i</span><span class="p" id="mw7Q">]</span><span class="w" id="mw7g"> </span><span class="o" id="mw7w">+</span><span class="w" id="mw8A"> </span><span class="n" id="mw8Q">b</span><span class="p" id="mw8g">[</span><span class="n" id="mw8w">i</span><span class="p" id="mw9A">];</span> <span class="p" id="mw9Q">}</span>

Running a WebCL application involves the following steps:

  1. Allow access to devices and provide context
  2. Hand over the kernel to a device
  3. Cause the device to execute the kernel
  4. Retrieve results from the device
  5. Use the data inside JavaScript

Further details about the same can be found at

Sign in to keep reading

3 more chapters are free with a Lably account.

More in Computing and communication