小编hav*_*ogt的帖子

CUDA 7.5实验__host__ __device__ lambdas

我玩了一些实验设备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)

c++ lambda cuda c++11

5
推荐指数
1
解决办法
1059
查看次数

标签 统计

c++ ×1

c++11 ×1

cuda ×1

lambda ×1