需要将C++模板转换为C99代码

Jac*_*cko 3 templates cuda opencl

我正在将CUDA代码移植到OpenCL - CUDA允许C++构造像模板,而OpenCL严格来说是C99.那么,将templatest移植到C的最无痛的方法是什么?我想过为模板参数使用函数指针.

Rog*_*ahl 6

在有模板之前,有预处理器宏.

在网上搜索"C语言中的通用编程"以获取灵感.


dde*_*dov 5

这是我用于将一些CUDA算法从现代GPU代码转换为我的GPGPU VexCL库(支持OpenCL)的技术.

CUDA代码中的每个模板函数都转换为OpenCL主机代码中的两个模板函数.第一个主机函数('name'函数)返回生成的OpenCL函数的错位名称(因此具有不同模板参数的函数具有不同的名称); 第二个主机函数('source'函数)返回生成的OpenCL函数源代码的字符串表示形式.然后,这些函数用于生成主内核代码.

CTAMergeSort CUDA功能模板为例.它将转换为VexCL代码中merge_sort函数的两个重载.我所说的"源"功能,以功能定义添加到OpenCL的内核源代码在这里,然后使用"姓名"功能,它的调用添加到内核这里.

请注意,backend::source_generatorVexCL用于透明地生成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)