Jac*_*cko 3 templates cuda opencl
我正在将CUDA代码移植到OpenCL - CUDA允许C++构造像模板,而OpenCL严格来说是C99.那么,将templatest移植到C的最无痛的方法是什么?我想过为模板参数使用函数指针.
这是我用于将一些CUDA算法从现代GPU代码转换为我的GPGPU VexCL库(支持OpenCL)的技术.
CUDA代码中的每个模板函数都转换为OpenCL主机代码中的两个模板函数.第一个主机函数('name'函数)返回生成的OpenCL函数的错位名称(因此具有不同模板参数的函数具有不同的名称); 第二个主机函数('source'函数)返回生成的OpenCL函数源代码的字符串表示形式.然后,这些函数用于生成主内核代码.
以CTAMergeSort CUDA功能模板为例.它将转换为VexCL代码中merge_sort函数的两个重载.我所说的"源"功能,以功能定义添加到OpenCL的内核源代码在这里,然后使用"姓名"功能,它的调用添加到内核这里.
请注意,backend::source_generator
VexCL用于透明地生成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);
}
Run Code Online (Sandbox Code Playgroud)