0

目前我正在研究提供OpenCLGPU 管道的项目。该项目是为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手机是否支持任务并行?如何检查它是否支持?

任何帮助,将不胜感激。感谢您的关注!

4

0 回答 0