OpenCL

From Wikipedia, the free encyclopedia
Jump to: navigation, search
OpenCL
OpenCL logo
Original author(s) Apple Inc.
Developer(s) Khronos Group
Stable release 1.2 / 15 November 2011; 20 months ago (2011-11-15)
Preview release 2.0 / 22 July 2013; 31 days ago (2013-07-22)
Operating system Cross-platform
Type API
License Unspecified
Website www.khronos.org/opencl
www.khronos.org/webcl

Open Computing Language (OpenCL) is a framework for writing programs that execute across heterogeneous platforms consisting of central processing units (CPUs), graphics processing units (GPUs), digital signal processors (DSPs) and other processors. OpenCL includes a language (based on C99) for writing kernels (functions that execute on OpenCL devices), plus application programming interfaces (APIs) that are used to define and then control the platforms. OpenCL provides parallel computing using task-based and data-based parallelism. OpenCL is an open standard maintained by the non-profit technology consortium Khronos Group. It has been adopted by Apple, Intel, Qualcomm, Advanced Micro Devices (AMD), Nvidia, Altera, Samsung, Vivante and ARM Holdings.

For example, OpenCL can be used to give an application access to a graphics processing unit for non-graphical computing (see general-purpose computing on graphics processing units). Academic researchers have investigated automatically compiling OpenCL programs into application-specific processors running on FPGAs,[1] and commercial FPGA vendors are developing tools to translate OpenCL to run on their FPGA devices.[2]

History[edit source | edit]

OpenCL was initially developed by Apple Inc., which holds trademark rights, and refined into an initial proposal in collaboration with technical teams at AMD, IBM, Qualcomm, Intel, and Nvidia. Apple submitted this initial proposal to the Khronos Group. On 16 June 2008, the Khronos Compute Working Group was formed[3] with representatives from CPU, GPU, embedded-processor, and software companies. This group worked for five months to finish the technical details of the specification for OpenCL 1.0 by 18 November 2008.[4] This technical specification was reviewed by the Khronos members and approved for public release on 8 December 2008.[5]

OpenCL 1.0[edit source | edit]

OpenCL 1.0 has been released with Mac OS X Snow Leopard. According to an Apple press release:[6]

Snow Leopard further extends support for modern hardware with Open Computing Language (OpenCL), which lets any application tap into the vast gigaflops of GPU computing power previously available only to graphics applications. OpenCL is based on the C programming language and has been proposed as an open standard.

AMD has decided to support OpenCL instead of the now deprecated Close to Metal in its Stream framework.[7][8] RapidMind announced their adoption of OpenCL underneath their development platform to support GPUs from multiple vendors with one interface.[9] On 9 December 2008, Nvidia announced its intention to add full support for the OpenCL 1.0 specification to its GPU Computing Toolkit.[10] On 30 October 2009, IBM released its first OpenCL implementation as a part of the XL compilers.[11]

OpenCL 1.1[edit source | edit]

OpenCL 1.1 was ratified by the Khronos Group on 14 June 2010[12] and adds significant functionality for enhanced parallel programming flexibility, functionality, and performance including:

  • New data types including 3-component vectors and additional image formats;
  • Handling commands from multiple host threads and processing buffers across multiple devices;
  • Operations on regions of a buffer including read, write and copy of 1D, 2D, or 3D rectangular regions;
  • Enhanced use of events to drive and control command execution;
  • Additional OpenCL built-in C functions such as integer clamp, shuffle, and asynchronous strided copies;
  • Improved OpenGL interoperability through efficient sharing of images and buffers by linking OpenCL and OpenGL events.

OpenCL 1.2[edit source | edit]

On 15 November 2011, the Khronos Group announced the OpenCL 1.2 specification,[13] which added significant functionality over the previous versions in terms of performance and features for parallel programming. Most notable features include:

  • Device partitioning: the ability to partition a device into sub-devices so that work assignments can be allocated to individual compute units. This is useful for reserving areas of the device to reduce latency for time-critical tasks.
  • Separate compilation and linking of objects: the functionality to compile OpenCL into external libraries for inclusion into other programs.
  • Enhanced image support: 1.2 adds support for 1D images and 1D/2D image arrays. Furthermore, the OpenGL sharing extensions now allow for OpenGL 1D textures and 1D/2D texture arrays to be used to create OpenCL images.
  • Built-in kernels: custom devices that contain specific unique functionality are now integrated more closely into the OpenCL framework. Kernels can be called to use specialised or non-programmable aspects of underlying hardware. Examples include video encoding/decoding and digital signal processors.
  • DirectX functionality: DX9 media surface sharing allows for efficient sharing between OpenCL and DX9 or DXVA media surfaces. Equally, for DX11, seamless sharing between OpenCL and DX11 surfaces is enabled.

OpenCL 2.0[edit source | edit]

Updates and additions to OpenCL 2.0 include[14] (OpenCL 2.0 specification is provisional, thus still subject to change):

  • Shared Virtual Memory
  • Dynamic Parallelism
  • Generic Address Space
  • Images
  • C11 Atomics
  • Pipes
  • Android Installable Client Driver Extension

List of vendor implementation dates[edit source | edit]

  • On 10 December 2008, AMD and Nvidia held the first public OpenCL demonstration, a 75-minute presentation at Siggraph Asia 2008. AMD showed a CPU-accelerated OpenCL demo explaining the scalability of OpenCL on one or more cores while Nvidia showed a GPU-accelerated demo.[15][16]
  • On 16 March 2009, at the 4th Multicore Expo, Imagination Technologies announced the PowerVR SGX543MP, the first GPU of this company to feature OpenCL support.[17]
  • On 26 March 2009, at GDC 2009, AMD and Havok demonstrated the first working implementation for OpenCL accelerating Havok Cloth on AMD Radeon HD 4000 series GPU.[18]
  • On 20 April 2009, Nvidia announced the release of its OpenCL driver and SDK to developers participating in its OpenCL Early Access Program.[19]
  • On 5 August 2009, AMD unveiled the first development tools for its OpenCL platform as part of its ATI Stream SDK v2.0 Beta Program.[20]
  • On 28 August 2009, Apple released Mac OS X Snow Leopard, which contains a full implementation of OpenCL.[21]
OpenCL in Snow Leopard is supported on the Nvidia GeForce 320M, GeForce GT 330M, GeForce 9400M, GeForce 9600M GT, GeForce 8600M GT, GeForce GT 120, GeForce GT 130, GeForce GTX 285, GeForce 8800 GT, GeForce 8800 GS, Quadro FX 4800, Quadro FX5600, ATI Radeon HD 4670, ATI Radeon HD 4850, Radeon HD 4870, ATI Radeon HD 5670, ATI Radeon HD 5750, ATI Radeon HD 5770 and ATI Radeon HD 5870.[22]
  • On 28 September 2009, Nvidia released its own OpenCL drivers and SDK implementation.
  • On 13 October 2009, AMD released the fourth beta of the ATI Stream SDK 2.0, which provides a complete OpenCL implementation on both R700/R800 GPUs and SSE3 capable CPUs. The SDK is available for both Linux and Windows.[23]
  • On 26 November 2009, Nvidia released drivers for OpenCL 1.0 (rev 48).
The Apple,[24] Nvidia,[25] RapidMind[26] and Gallium3D[27] implementations of OpenCL are all based on the LLVM Compiler technology and use the Clang Compiler as its frontend.
  • On 27 October 2009, S3 released their first product supporting native OpenCL 1.0 - the Chrome 5400E embedded graphics processor.[28]
  • On 10 December 2009, VIA released their first product supporting OpenCL 1.0 - ChromotionHD 2.0 video processor included in VN1000 chipset.[29]
  • On 21 December 2009, AMD released the production version of the ATI Stream SDK 2.0,[30] which provides OpenCL 1.0 support for R800 GPUs and beta support for R700 GPUs.
  • On 1 June 2010, ZiiLABS released details of their first OpenCL implementation for the ZMS processor for handheld, embedded and digital home products.[31]
  • On 30 June 2010, IBM released a fully conformant version of OpenCL 1.0.[32]
  • On 13 September 2010, Intel released details of their first OpenCL implementation for the Sandy Bridge chip architecture. Sandy Bridge will integrate Intel's newest graphics chip technology directly onto the central processing unit.[33]
  • On 15 November 2010, Wolfram Research released Mathematica 8 with OpenCLLink package.
  • On 3 March 2011, Khronos Group announces the formation of the WebCL working group to explore defining a JavaScript binding to OpenCL. This creates the potential to harness GPU and multi-core CPU parallel processing from a Web browser.[34][35]
  • On 31 March 2011, IBM released a fully conformant version of OpenCL 1.1.[32][36]
  • On 25 April 2011, IBM released OpenCL Common Runtime v0.1 for Linux on x86 Architecture.[37]
  • On 4 May 2011, Nokia Research releases an open source WebCL extension for the Firefox web browser, providing a JavaScript binding to OpenCL.[38]
  • On 1 July 2011, Samsung Electronics releases an open source prototype implementation of WebCL for WebKit, providing a JavaScript binding to OpenCL.[39]
  • On 8 August 2011, AMD released the OpenCL-driven AMD Accelerated Parallel Processing (APP) Software Development Kit (SDK) v2.5, replacing the ATI Stream SDK as technology and concept.[40]
  • On 12 December 2011, AMD released AMD APP SDK v2.6[41] which contains a preview of OpenCL 1.2.
  • On 27 February 2012, The Portland Group released the PGI OpenCL compiler for multi-core ARM CPUs.[42]
  • On 17 April 2012 Khronos released a WebCL working draft.[43]

OpenCL language[edit source | edit]

The programming language used to write computation kernels is based on C99 with some limitations and additions. It omits the use of function pointers, recursion, bit fields, variable-length arrays, and standard C99 header files.[44] The language is extended to easily use parallelism with vector types and operations, synchronization, functions to work with work-items/groups.[45] It has memory region qualifiers: __global, __local, __constant, and __private. Also, many built-in functions are added.

Example: computing the FFT[edit source | edit]

This example will load a fast Fourier transform (FFT) implementation and execute it. The implementation is shown below. [46]

  // create a compute context with GPU device
  context = clCreateContextFromType(NULL, CL_DEVICE_TYPE_GPU, NULL, NULL, NULL);
 
  // create a command queue
  clGetDeviceIDs( NULL, CL_DEVICE_TYPE_DEFAULT, 1, &device_id, NULL );
  queue = clCreateCommandQueue(context, device_id, 0, NULL);
 
  // allocate the buffer memory objects
  memobjs[0] = clCreateBuffer(context, CL_MEM_READ_ONLY | CL_MEM_COPY_HOST_PTR, sizeof(float)*2*num_entries, srcA, NULL);
  memobjs[1] = clCreateBuffer(context, CL_MEM_READ_WRITE, sizeof(float)*2*num_entries, NULL, NULL);
 
  // create the compute program
  program = clCreateProgramWithSource(context, 1, &fft1D_1024_kernel_src, NULL, NULL);
 
  // build the compute program executable
  clBuildProgram(program, 0, NULL, NULL, NULL, NULL);
 
  // create the compute kernel
  kernel = clCreateKernel(program, "fft1D_1024", NULL);
 
  // set the args values
  clSetKernelArg(kernel, 0, sizeof(cl_mem), (void *)&memobjs[0]);
  clSetKernelArg(kernel, 1, sizeof(cl_mem), (void *)&memobjs[1]);
  clSetKernelArg(kernel, 2, sizeof(float)*(local_work_size[0]+1)*16, NULL);
  clSetKernelArg(kernel, 3, sizeof(float)*(local_work_size[0]+1)*16, NULL);
 
  // create N-D range object with work-item dimensions and execute kernel
  global_work_size[0] = num_entries;
  local_work_size[0] = 64; //Nvidia: 192 or 256
  clEnqueueNDRangeKernel(queue, kernel, 1, NULL, global_work_size, local_work_size, 0, NULL, NULL);

The actual calculation (based on Fitting FFT onto the G80 Architecture):[47]

  // This kernel computes FFT of length 1024. The 1024 length FFT is decomposed into
  // calls to a radix 16 function, another radix 16 function and then a radix 4 function
 
  __kernel void fft1D_1024 (__global float2 *in, __global float2 *out,
                          __local float *sMemx, __local float *sMemy) {
    int tid = get_local_id(0);
    int blockIdx = get_group_id(0) * 1024 + tid;
    float2 data[16];
 
    // starting index of data to/from global memory
    in = in + blockIdx;  out = out + blockIdx;
 
    globalLoads(data, in, 64); // coalesced global reads
    fftRadix16Pass(data);      // in-place radix-16 pass
    twiddleFactorMul(data, tid, 1024, 0);
 
    // local shuffle using local memory
    localShuffle(data, sMemx, sMemy, tid, (((tid & 15) * 65) + (tid >> 4)));
    fftRadix16Pass(data);               // in-place radix-16 pass
    twiddleFactorMul(data, tid, 64, 4); // twiddle factor multiplication
 
    localShuffle(data, sMemx, sMemy, tid, (((tid >> 4) * 64) + (tid & 15)));
 
    // four radix-4 function calls
    fftRadix4Pass(data);      // radix-4 function number 1
    fftRadix4Pass(data + 4);  // radix-4 function number 2
    fftRadix4Pass(data + 8);  // radix-4 function number 3
    fftRadix4Pass(data + 12); // radix-4 function number 4
 
    // coalesced global writes
    globalStores(data, out, 64);
  }

A full, open source implementation of an OpenCL FFT can be found on Apple's website.[48]

OpenCL-conformant products[edit source | edit]

The Khronos Group maintains an extended list of OpenCL-conformant products.[49]

Synopsis of OpenCL conformant products[50]
AMD APP SDK (supports OpenCL CPU and accelerated processing unit Devices) X86 + SSE2 (or higher) compatible CPUs 64-bit & 32-bit;[51] Linux 2.6 PC, Windows Vista/7 PC AMD Fusion E-350, E-240, C-50, C-30 with HD 6310/HD 6250 AMD Radeon/Mobility HD 6800, HD 5x00 series GPU, iGPU HD 6310/HD 6250 ATI FirePro Vx800 series GPU
Intel SDK for OpenCL Applications 2012[52] (supports Intel Core processors and Intel HD Graphics 4000/2500) Intel CPUs with SSE 4.1, SSE 4.2 or AVX support.[53][54] Microsoft Windows, Linux Intel Core i7, i5, i3; 2nd Generation Intel Core i7/5/3, 3rd Generation Intel Core Processors with Intel HD Graphics 4000/2500 Intel Core 2 Solo, Duo Quad, Extreme Intel Xeon 7x00,5x00,3x00 (Core based)
IBM Servers with OpenCL Development Kit for Linux on Power running on Power VSX[55][56] IBM Power 755 (PERCS), 750 IBM BladeCenter PS70x Express IBM BladeCenter JS2x, JS43 IBM BladeCenter QS22
IBM OpenCL Common Runtime (OCR)

[57]

X86 + SSE2 (or higher) compatible CPUs 64-bit & 32-bit;[58] Linux 2.6 PC AMD Fusion, Nvidia Ion and Intel Core i7, i5, i3; 2nd Generation Intel Core i7/5/3 AMD Radeon, Nvidia GeForce and Intel Core 2 Solo, Duo, Quad, Extreme ATI FirePro, Nvidia Quadro and Intel Xeon 7x00,5x00,3x00 (Core based)
Nvidia OpenCL Driver and Tools[59] Nvidia Tesla C/D/S Nvidia GeForce GTS/GT/GTX Nvidia Ion Nvidia Quadro FX/NVX/Plex

Extensions[edit source | edit]

Some vendors provide extended functionality over the standard OpenCL specification via the means of extensions. These are still specified by Khronos but provided by vendors within their SDKs. They often contain features that are to be implemented in the future - for example device fission functionality was originally an extension but is now provided as part of the 1.2 specification.

Extensions provided in the 1.2 specification include:

  • Writing to 3D image memory objects
  • Half-precision floating-point format
  • Sharing memory objects with OpenGL
  • Creating event objects from GL sync objects
  • Sharing memory objects with Direct3D 10
  • DX9 media Surface Sharing
  • Sharing Memory Objects with Direct3D 11

Device fission[edit source | edit]

Device fission - introduced fully into the OpenCL standard with version 1.2 - allows individual command queues to be used for specific areas of a device. For example, within the Intel SDK, a command queue can be created that maps directly to an individual core. AMD also provides functionality for device fission, also originally as an extension. Device fission can be used where the availability of compute is required reliably, such as in a latency sensitive environment. Fission effectively reserves areas of the device for computation.

Comparison with CUDA[edit source | edit]

Two comparisons have been drawn between CUDA and OpenCL since its inception,[60][61] and both arrived at the same conclusion: if the OpenCL implementation is correctly tweaked to suit the target architecture, it performs no worse than CUDA. Because the key feature of OpenCL is portability (via its abstracted memory and execution model), the programmer is not able to directly use GPU-specific technologies (such as inline PTX) unless they are willing to give up direct portability. CUDA is more directly connected to the platform upon which it will be executing because it is limited to Nvidia hardware. Compiler technology for both standards supported by Nvidia's toolkit is based upon LLVM and compiles to Nvidia's PTX instruction set abstraction.

See also[edit source | edit]

References[edit source | edit]

  1. ^ Jääskeläinen, Pekka O.; de La Lama, Carlos S.; Huerta, Pablo; Takala, Jarmo H. (July 2010). "OpenCL-based design methodology for application-specific processors". 2010 International Conference on Embedded Computer Systems (SAMOS) (IEEE): 223–230. doi:10.1109/ICSAMOS.2010.5642061. ISBN 978-1-4244-7936-8. Retrieved 17 February 2011. 
  2. ^ "Jobs at Altera". Archived from the original on 21 July 2011. 
  3. ^ "Khronos Launches Heterogeneous Computing Initiative" (Press release). Khronos Group. 16 June 2008. Retrieved 18 June 2008. 
  4. ^ "OpenCL gets touted in Texas". MacWorld. 20 November 2008. Retrieved 12 June 2009. 
  5. ^ "The Khronos Group Releases OpenCL 1.0 Specification" (Press release). Khronos Group. 8 December 2008. Retrieved 12 June 2009. 
  6. ^ "Apple Previews Mac OS X Snow Leopard to Developers" (Press release). Apple Inc. 9 June 2008. Retrieved 9 June 2008. 
  7. ^ "AMD Drives Adoption of Industry Standards in GPGPU Software Development" (Press release). AMD. 6 August 2008. Retrieved 14 August 2008. 
  8. ^ "AMD Backs OpenCL, Microsoft DirectX 11". eWeek. 6 August 2008. Retrieved 14 August 2008. 
  9. ^ "HPCWire: RapidMind Embraces Open Source and Standards Projects". HPCWire. 10 November 2008. Retrieved 11 November 2008. 
  10. ^ "Nvidia Adds OpenCL To Its Industry Leading GPU Computing Toolkit" (Press release). Nvidia. 9 December 2008. Retrieved 10 December 2008. 
  11. ^ "OpenCL Development Kit for Linux on Power". alphaWorks. 30 October 2009. Retrieved 30 October 2009. 
  12. ^ Khronos Drives Momentum of Parallel Computing Standard with Release of OpenCL 1.1 Specification
  13. ^ Khronos Releases OpenCL 1.2 Specification
  14. ^ Khronos Releases OpenCL 2.0
  15. ^ "OpenCL Demo, AMD CPU". 10 December 2008. Retrieved 28 March 2009. 
  16. ^ "OpenCL Demo, Nvidia GPU". 10 December 2008. Retrieved 28 March 2009. 
  17. ^ "Imagination Technologies launches advanced, highly-efficient POWERVR SGX543MP multi-processor graphics IP family". Imagination Technologies. 19 March 2009. Retrieved 30 January 2011. 
  18. ^ "AMD and Havok demo OpenCL accelerated physics". PC Perspective. 26 March 2009. Retrieved 28 March 2009. 
  19. ^ "Nvidia Releases OpenCL Driver To Developers". Nvidia. 20 April 2009. Retrieved 27 April 2009. 
  20. ^ "AMD does reverse GPGPU, announces OpenCL SDK for x86". Ars Technica. 5 August 2009. Retrieved 6 August 2009. 
  21. ^ Dan Moren; Jason Snell (8 June 2009). "Live Update: WWDC 2009 Keynote". macworld.com. MacWorld. Retrieved 12 June 2009. 
  22. ^ "Mac OS X Snow Leopard – Technical specifications and system requirements". Apple Inc. 23 March 2011. Retrieved 23 March 2011. 
  23. ^ "ATI Stream Software Development Kit (SDK) v2.0 Beta Program". Retrieved 14 October 2009. [dead link]
  24. ^ "Apple entry on LLVM Users page". Retrieved 29 August 2009. 
  25. ^ "Nvidia entry on LLVM Users page". Retrieved 6 August 2009. 
  26. ^ "Rapidmind entry on LLVM Users page". Retrieved 1 October 2009. 
  27. ^ "Zack Rusin's blog post about the Gallium3D OpenCL implementation". Retrieved 1 October 2009. 
  28. ^ "S3 Graphics launched the Chrome 5400E embedded graphics processor". Retrieved 27 October 2009. 
  29. ^ "VIA Brings Enhanced VN1000 Graphics Processor]". Retrieved 10 December 2009. 
  30. ^ "ATI Stream SDK v2.0 with OpenCL 1.0 Support". Retrieved 23 October 2009. 
  31. ^ http://www.ziilabs.com/opencl
  32. ^ a b "Khronos Group Conformant Products". 
  33. ^ "Intel discloses new Sandy Bridge technical details". Retrieved 13 September 2010. 
  34. ^ WebCL related stories
  35. ^ Khronos Releases Final WebGL 1.0 Specification
  36. ^ "OpenCL Development Kit for Linux on Power". 
  37. ^ "About the OpenCL Common Runtime for Linux on x86 Architecture". 
  38. ^ Nokia Research releases WebCL prototype
  39. ^ Samsung's WebCL Prototype for WebKit
  40. ^ "AMD Opens the Throttle on APU Performance with Updated OpenCL Software Development ". Amd.com. 2011-08-08. Retrieved 2013-06-16. 
  41. ^ AMD APP SDK v2.6
  42. ^ "The Portland Group Announces OpenCL Compiler for ST-Ericsson ARM-Based NovaThor SoCs". Retrieved 4 May 2012. 
  43. ^ WebCL Latest Spec
  44. ^ AMD. Introduction to OpenCL Programming 201005, page 89-90
  45. ^ AMD. Introduction to OpenCL Programming 201005, page 89-90
  46. ^ "OpenCL". SIGGRAPH2008. 14 August 2008. Retrieved 14 August 2008. 
  47. ^ "Fitting FFT onto G80 Architecture" (PDF). Vasily Volkov and Brian Kazian, UC Berkeley CS258 project report. May 2008. Retrieved 14 November 2008. 
  48. ^ "OpenCL on FFT". Apple. 16 November 2009. Retrieved 7 December 2009. 
  49. ^ OpenCL Conformant Products
  50. ^ "Conformant Products". Retrieved 11 August 2011. 
  51. ^ "OpenCL and the AMD APP SDK". AMD Developer Central. developer.amd.com. Retrieved 11 August 2011. 
  52. ^ "About Intel OpenCL SDK 1.1". software.intel.com. intel.com. Retrieved 11 August 2011. 
  53. ^ "Product Support". Retrieved 11 August 2011. 
  54. ^ "Intel OpenCL SDK - Release Notes". Retrieved 11 August 2011. 
  55. ^ "Announcing OpenCL Development Kit for Linux on Power v0.3". Retrieved 11 August 2011. 
  56. ^ "IBM releases OpenCL Development Kit for Linux on Power v0.3 - OpenCL 1.1 conformant release available". OpenCL Lounge. ibm.com. Retrieved 11 August 2011. 
  57. ^ "IBM releases OpenCL Common Runtime for Linux on x86 Architecture". Retrieved 10 September 2011. 
  58. ^ "OpenCL and the AMD APP SDK". AMD Developer Central. developer.amd.com. Retrieved 10 September 2011. 
  59. ^ "Nvidia Releases OpenCL Driver". Retrieved 11 August 2011. 
  60. ^ Kamran Karimi, Neil G. Dickson, Firas Hamze (16 May 2011). A Performance Comparison of CUDA and OpenCL. arXiv:1005.2581v3. Retrieved 12 January 2012. 
  61. ^ Fang, Jianbin; Varbanescu, Ana Lucia; Sips, Henk (2011). "A Comprehensive Performance Comparison of CUDA and OpenCL". 2011 International Conference on Parallel Processing. p. 216. doi:10.1109/ICPP.2011.45. ISBN 978-1-4577-1336-1. Retrieved 12 January 2012. 

External links[edit source | edit]

Documentation[edit source | edit]

Drivers[edit source | edit]

Libraries[edit source | edit]

Language bindings and wrappers[edit source | edit]

JavaScript - WebCL:

Java:

Python:

Ruby:

  • No bindings are actually maintained[1]

Rust:

D:

C#:

thinBasic:

Tools[edit source | edit]