我正在将CUDA代码移植到OpenCL - CUDA允许C ++构造像模板,而OpenCL严格来说是C99。那么,将templatest移植到C的最无痛的方法是什么? 我想过为模板参数使用函数指针。
答案 0 :(得分:6)
在有模板之前,有预处理器宏。
在网页上搜索“C语言中的通用编程”以获取灵感。
答案 1 :(得分:5)
这是我用于将一些CUDA算法从Modern GPU代码转换为我的GPGPU VexCL库(支持OpenCL)的技术。
CUDA代码中的每个模板函数都转换为OpenCL主机代码中的两个模板函数。第一个主机函数('name'函数)返回生成的OpenCL函数的错位名称(因此具有不同模板参数的函数具有不同的名称);第二个主机函数('source'函数)返回生成的OpenCL函数源代码的字符串表示形式。然后,这些函数用于生成主内核代码。
例如,使用CTAMergeSort CUDA功能模板。它将转换为VexCL代码中merge_sort函数的两个重载。我调用'source'函数是为了将函数定义添加到OpenCL内核源here,然后使用'name'函数将其调用添加到内核here。
请注意,VexCL中的backend::source_generator
用于透明地生成OpenCL或CUDA代码。在您的情况下,代码生成可以更简单。
为了使所有内容更加清晰,以下是为mergesort<256,11,int,float>
模板实例生成的代码:
void mergesort_256_11_int_float
(
int count,
int tid,
int * thread_keys0,
local int * keys_shared0,
float * thread_vals0,
local float * vals_shared0
)
{
if(11 * tid < count) odd_even_transpose_sort_11_int_float(thread_keys0, thread_vals0);
thread_to_shared_11_int(thread_keys0, tid, keys_shared0);
block_sort_loop_256_11_int_float(tid, count, keys_shared0, thread_vals0, vals_shared0);
}
答案 2 :(得分:0)
看看Boost.Compute。它为OpenCL提供了类似C ++,STL的API。