目前我正在研究提供OpenCL
GPU 管道的项目。该项目是为Android OS
。
目前,当涉及到某些高通处理器时,我遇到了性能问题。通常 GPU 管道正在执行,9-11 ms
但有时执行时间可能会达到40-50 ms
.
我决定我需要解决两个可能的问题——内存访问(在默认情况下让系统尽可能地卸载我的缓冲区)和内核开销。
为了解决这个问题,我转向了task parallelism
功能OpenCL 2.0
。基本上,它允许我在 GPU 级别加载新内核的队列,这有助于使工作序列更加紧凑和高效。
我写了一个非常简单的例子来测试它是如何工作的:
__kernel void child_kernel(__global const int* buff) {
buff[get_global_id(0)] = get_global_id(1);
}
__kernel void parent_kernel(__global const int* buff) {
size_t offset[] = {1, 1};
size_t work_size[] = {100, 50};
ndrange_t testRange = ndrange_2D(offset, work_size);
void (^operation)(void) = ^{
child_kernel(buff);
};
enqueue_kernel(get_default_queue(),
CLK_ENQUEUE_FLAGS_WAIT_KERNEL,
testRange,
operation);
}
不幸的是,这个简单的例子不起作用。我的buff
仍然包含零,没有任何内容。所以我的问题是 - 我在这里做错了吗?Android手机是否支持任务并行?如何检查它是否支持?
任何帮助,将不胜感激。感谢您的关注!