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

时间:2014-03-17 23:35:16

标签: templates cuda opencl

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

3 个答案:

答案 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。