我玩了一些实验设备lambdas,它在CUDA 7.5中引入并在Mark Harris的博客文章中进行了推广.
对于以下示例,我删除了许多不需要显示我的问题的东西(我的实际实现看起来更好......).
我尝试编写一个foreach函数,该函数可以在设备上的向量(每个元素1个线程)或主机(串行)上运行,具体取决于模板参数.有了这个foreach函数,我可以轻松实现BLAS函数.作为一个例子,我使用向量的每个组件分配一个标量(我最后附上完整的代码):
template<bool onDevice> void assignScalar( size_t size, double* vector, double a )
{
auto assign = [=] __host__ __device__ ( size_t index ) { vector[index] = a; };
if( onDevice )
{
foreachDevice( size, assign );
}
else
{
foreachHost( size, assign );
}
}
Run Code Online (Sandbox Code Playgroud)
但是,由于__host__ __device__
lambda ,此代码会产生编译器错误:
lambda("lambda - > void")的闭包类型不能在__global__函数模板实例化的模板参数类型中使用,除非lambda在__device__或__global__函数中定义
如果我__device__
从lambda表达式中删除,我得到相同的错误,如果我删除__host__
(只有__device__
lambda),我没有得到编译错误,但在这种情况下,主机部分没有被执行...
如果我将lambda定义为__host__
或者__device__
单独定义,则代码将按预期编译并运行.
template<bool onDevice> void assignScalar2( size_t size, …
Run Code Online (Sandbox Code Playgroud)