具有通用数据类型的 OpenCL 内核

OpenCL kernel with generic data type

在为内核编写代码时,是否可以指定通用数据类型,这样就不必为每种使用的数据类型复制内核?目前我正在使用预处理器宏来定义具有各种数据类型的整个函数:

#define REDUCTION(type) __kernel void reduce_##type##_f(__global __read_only type* a) \
{ \
// do something
} \

REDUCTION(float)
REDUCTION(float2)

然而,这不是很舒服。是否有像 gentype 这样的类型说明符可用?

从 OpenCL 2.1 开始,您应该能够做到这一点,它允许您在内核代码中使用 C++ 和模板 Knronos's OpenCL page

有了它,你可以简单地写:

template <class T>
void reduce_f(__global __read_only T* a) { 
   // do something
}

但是我不能 100% 确定模板在 __kernel 函数的定义中可用。如果不是这种情况,您仍然需要将内核声明包装在预处理宏中,如下所示:

#define REDUCTION(type) __kernel void reduce_##type##_f(__global __read_only type* a) \
{ \
  return reduce_t(a); \
}

REDUCTION(float)