【发布时间】:2011-05-27 04:50:34
【问题描述】:
我正在开发一个 OpenCL 程序,它使用“cl_khr_byte_addressable_store”扩展名来允许在内核代码中进行字节级写入;为了让我的程序也能在不支持扩展的 GPU 上运行,我需要检查扩展是否可用,并在不支持的平台上使用 int 类型而不是 char。
在内核代码中,我可以简单地添加以下 sn -p 并在整个内核代码中使用writeable_type;如果扩展可用,则 OpenCL 内核编译器会自动添加预处理器定义 cl_khr_byte_addressable_store。
/* kernel.cl */
#ifdef cl_khr_byte_addressable_store
typedef char writeable_type;
#else
typedef int writeable_type;
#endif
f() {
writeable_type x = 1;
}
在我的主机代码中,我没有那个预处理器定义,并且(据我所知)检查扩展是否可用只能在运行时完成:
/* host.cpp */
void execute() {
std::string extensions;
this->opencl->getExtensions(extensions);
if (extensions.find("cl_khr_byte_addressable_store") != std::string::npos) {
// extension is available
typedef cl_char writeable_type;
}
else {
// extension is not available
typedef cl_int writeable_type;
}
writeable_type x = 1;
}
这就是我的问题;因为 typedef 是在编译时解析的,并且只在定义它们的块内有效,所以上面的示例不起作用。
是否有可能以某种方式做到这一点?
感谢 rlc、Neil Butterworth 和 talonmis 让我走上了正确的道路!结果证明我的问题的解决方案相当简单:
/*host.cpp*/
void execute() {
bool extension_available = ...;
if (extension_available)
this->_execute<cl_char>();
else
this->_execute<cl_int>();
}
template <typename writeable_char>
void _execute() {
writeable_type x = 1;
// ...
}
【问题讨论】: