在客户端,我创建了一个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的一个实例?