Board logo

标题: 使用 OpenCL 加速 Web 应用程序(2)编写 WebCL 应用程序 [打印本页]

作者: look_w    时间: 2018-10-18 19:54     标题: 使用 OpenCL 加速 Web 应用程序(2)编写 WebCL 应用程序

编写 WebCL 应用程序WebCL 技术对新手来说会很神秘,所以牢记以下总目标非常重要:
显示了这一过程。
图 1. WebCL 应用程序的操作WebCL 类和函数要使用 Nokia 的工具集构建一个 WebCL 应用程序,则需要熟悉七个 JavaScript 类。表 1 列出每个类及其重要的函数。
表 1. 重要的 WebCL 类和函数类用途函数IWebCL包含访问平台和设备的静态函数getPlatformIDs()

createContext(properties, devices)

createContextFromType(properties, device_type)IWebCLPlatform代表一个安装在主机上的 OpenCL SDKgetDeviceIDs(device_type)IWebCLDevice代表一个符合 OpenCL 标准的物理设备getDeviceInfo(name)IWebCLContext管理程序、内存对象和命令队列createProgramWithSource(source_text)

createBuffer(flags, size)

createCommandQueue(device, properties)IWebCLProgram源代码包含一个或者多个内核函数buildProgram(devices, options)

createKernel(kernel_name)IWebCLKernel特殊编码函数,能够通过一个 OpenCL 编译设备执行setKernelArg(index, value, type)IWebCLCommandQueue支持主机和设备间的通信enqueueReadBuffer(mem_object, blocking, offset, size,                                 data_object, wait_list)

enqueueWriteBuffer(mem_object, blocking, offset, size,                                 data_object, wait_list)

enqueueTask(kernel, wait_list)

enqueueNDRangeKernel(kernel, dim, offset, global_size,                                 local_size, wait_list)
理解这些类如何相互配合使用需要花费一些时间,但是,一旦编码完成,只需极小改动就可以将一个 WebCL 应用程序复制粘贴到其他应用程序中。
一个简单示例示例代码(可以从  部分获取)中包含一个名为 simple.html 的文件,提供了完整的 WebCL 应用程序。JavaScript 代码和大多数 WebCL 应用程序代码一样,可以分为五个步骤:
工作项和 enqueueNDRangeKernel上述应用程序通过调用 enqueueTask 函数执行。在学习 WebCL 时这样没有问题,但是专业应用程序决不会使用这个函数,因为 enqueueTask 只使用了单一的线程执行内核,这有悖于大量使用 GPU 这类多并行设备的目的。
在 WebCL 中,处理线程被称为工作项。要理解如何使用它们,则需要参考 清单 6 中处理线程的嵌套循环。
清单 6. 处理线程
1
2
3
4
5
6
7
for(i=a; i<A; i++) {
   for(j=b; j<B; j++) {
      for(k=c; k<C; k++) {
         process_data(i, j, k);
      }
   }
}




process_data 函数有三个参数:i、j 和 k。每个参数都有不同的偏移量(a、b 和 c),以及不同的最大范围(A、B 和 C)。因此,参数范围就是 A - a、B - b 和 C - c。OpenCL 术语将索引范围称之为大小,指标数量称之为维数。因此,该循环有三个维度,大小分别为 A - a、B - b 和 C - c。
WebCL 的最大优势就是使用工作项执行函数迭代,例如 process_data,而不是时间密集型循环。工作项有不同维度(1、2 或者 3),它们每个都有惟一标识符,这些标识符都对应循环的特定迭代。如果工作项是使用二维执行的,那么一个工作项可能执行有惟一 ID (4, 5) 的内核,而另一个执行 ID 是 (5, 4) 的内核。请记住,这些工作项是并行执行的。
在 WebCL 中配置工作项,必须执行 enqueueNDRangeKernel,而不是 enqueueTask。这是 WebCL 编程接口中最重要的函数,它接受 6 个参数:
作为一个例子,可以考虑 清单 7 中的循环。
清单 7.  配置了一个 enqueueNDRangeKernel
1
2
3
4
5
6
7
for(i=5; i<50; i++) {
   for(j=6; j<60; j++) {
      for(k=7; k<70; k++) {
         process_data(i, j, k);
      }
   }
}




维数是 3,偏移量是 (5, 6, 7),工作项大小是 (45, 64, 73)。要使用 WebCL 执行 process_data,可以创建一个 IWebCLKernel 函数,并调用 enqueueNDRangeKernel 执行内核,如下所示:
1
queue.enqueueTask(kernel, 3, [5, 6, 7], [45, 64, 73], [], []);




最后两个参数被设置为空数组。虽然工作组和事件处理都是 WebCL 的优势,但它们不在本文的讨论范围之内。下一节将会介绍如何编写内核函数。




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0