如何在c ++中序列化和反序列化lambda对象?

时间:2016-05-16 21:57:15

标签: c++ c++11 serialization lambda cuda

在客户端,我创建了一个lambda对象;现在我想将此对象传输到服务器端,然后将其应用于那里。客户端的代码和服务器端的代码将使用不同的编译器分别编译,这意味着服务器端没有机会知道lambda对象的类型信息。是否可以使用序列化/反序列化方法执行此操作?

例如,我想使用CUDA加速我的程序。由于我的代码是模板化的,并且nvcc太差而无法正确处理它,我想将数据(双精度数组)和算法(lambda对象)传递给GPU,并在执行后获取结果。传输部分使用普通C ++编码,而执行部分使用CUDA扩展编码。

在主机端,我有一个定义为

的lambda对象
double p = 1.2345;    
auto&& obj = [p](double* x_){ (*x_) += p; }; 

我想将obj转移到GPU空间并将其应用到设备阵列device_ptr(我将其视为序列化)

//host code, client side, will compile with 'g++' or 'clang++'
double* device_ptr = ...;
unsigned long N = 1024;
void transfer_and_apply( double*, double*, void*, unsigned long );
transfer_and_apply( device_ptr, device_ptr+N, reinterpret_cast<void*>(std::addressof(obj)), sizeof(obj) );

在设备端,我想反序列化此对象,然后将算法应用于数据:

// hypothesis 
// server side, will compile with 'nvcc' compiler

struct device_object
{
  __device__ device_object( ... );
  __device__ void operator()( double* ) const;
  //....
};

__global__ void obj_apply(  double* p_start, device_object const& d_obj )
{
    unsigned long const index = blockDim.x * blockIdx.x + threadIdx.x;
    d_obj( p_start+index );
}

void transfer_and_apply( double* p_start, double* p_end, void* obj_data, unsigned long size )
{
    unsigned long dim = (p_end - p_start + 31) / 32;
    device_object const& device_obj = device_object( obj_data, size );
    obj_apply<<<dim, 32>>>( p_start, device_obj );
}

可以反序列化lambda对象&#39; obj&#39;下到device_obj的一个实例?

0 个答案:

没有答案