我试图基于一个布尔变量来模拟一个CUDA内核(如下所示:我应该用'if'语句统一两个类似的内核,冒着性能损失的风险吗?)但是我一直得到一个编译错误,说我的函数是不是模板.我认为我只是遗漏了一些显而易见的东西,所以非常令人沮丧.
以下不起作用:
util.cuh
#include "kernels.cuh"
//Utility functions
Run Code Online (Sandbox Code Playgroud)
kernels.cuh
#ifndef KERNELS
#define KERNELS
template<bool approx>
__global__ void kernel(...params...);
#endif
Run Code Online (Sandbox Code Playgroud)
kernels.cu
template<bool approx>
__global__ void kernel(...params...)
{
if(approx)
{
//Approximate calculation
}
else
{
//Exact calculation
}
}
template __global__ void kernel<false>(...params...); //Error occurs here
Run Code Online (Sandbox Code Playgroud)
main.cu
#include "kernels.cuh"
kernel<false><<<dimGrid,dimBlock>>>(...params...);
Run Code Online (Sandbox Code Playgroud)
以下DOES工作:
util.cuh
#include "kernels.cuh"
//Utility functions
Run Code Online (Sandbox Code Playgroud)
kernels.cuh
#ifndef KERNELS
#define KERNELS
template<bool approx>
__global__ void kernel(...params...);
template<bool approx>
__global__ void kernel(...params...)
{
if(approx)
{
//Approximate calculation
}
else
{
//Exact calculation …
Run Code Online (Sandbox Code Playgroud) 在过去十年中,GPU已经变得越来越普遍.最近的研究已经成功地将非结构化和基于指针的算法(广度优先搜索和Andersen的分析 - 分析是很好的例子)移植到GPU环境中.我们很快就会看到越来越多的图算法用于自适应网格细化和社交网络在GPU环境中执行.
这一趋势的另一个步骤将涉及更复杂的代码结构,如编译器甚至操作系统.据我所知,在这方面还没有做太多工作(尚).传统智慧告诉我们,许多操作系统代码(至少,目前的方式)不适合并行环境,因为它本质上是串行的,基于指针的等等; 但是,我们错误地使用了类似于BFS之类的算法的论证.
我更感兴趣的是,考虑到我们目前使用的工具是否可以实现操作系统或编译器,而不是为什么或为什么没有(或将不会)完成.我想它可以做到,但需要进行大量的算法更改.希望这会产生一个很好的讨论.
一个额外的,有些相关的想法:对精确异常的支持是否是操作系统案例的一个特别困难的障碍?
什么是需要使用空指针正确执行的应用程序示例?只需检查空指针并进行测试就不算数了.这个例子应该被C程序员"常用".
经过一番思考,我有一个可能的例子,但我不想影响答案(还).
编辑:这个问题是一个编程工作的访谈,需要知识而不是C语言中的神似技巧.答案不会是语言的一些深奥的方面.