在函数的参数列表中为一个类型指定多个地址空间

Specifying multiple address spaces for a type in the list of arguments of function

我用 OpenCL 写了一个函数:

void sort(int* array, int size)
{
}

我需要在 __private 数组和 __global 数组上调用一次函数。显然,在 OpenCL 中不允许为一个类型指定多个地址 space。因此,我应该复制函数的声明,而它们具有完全相同的主体:

void sort_g(__global int* array, int size)
{
}

void sort_p(__private int* array, int size)
{
}

这对于维护代码来说效率很低,我想知道是否有更好的方法在 OpenCL 中管理多个地址 space?

P.S.: 我不明白为什么 OpenCL 不允许一个类型有多个地址 space。编译器可以生成该函数的多个实例(每个地址一个 space),并在内核中调用它们后适当地使用它们。

  • 对于 OpenCL < 2.0,这就是语言的设计方式,无法绕过它,很遗憾。

  • 对于 OpenCL >= 2.0,随着 通用地址 space 的引入,您的第一段代码将按您预期的方式运行。

简而言之,升级到 2.0 将解决您的问题(并带来其他好处),否则您就不走运了(您也许可以将您的函数包装在宏中,但是 ew,宏)。