예제 #1
0
//================================================================================================
// Usage: caffe_('blob_set_data_multigpu', BlobIndex, new_data)
//20160215find
static void blob_set_data_multigpu(MEX_ARGS) {
	mxCHECK(nrhs == 2 && mxIsUint32(prhs[0]) && mxIsCell(prhs[1]),
		"Usage: caffe_('blob_set_data_multigpu', hBlob, new_multi_gpu_data_cell)");

	mxCHECK(sync_ptr != NULL,"blob_set_data_multigpu only work on multi-GPU solver");

	unsigned int blob_index = *(unsigned int*)(mxGetPr(prhs[0]));
	blob_index = blob_index - 1;
	//mexPrintf("Real Blob index: %d\n", blob_index);

	vector<shared_ptr<P2PSync<float>>>* sync_vec = sync_ptr->get_syncs();
	//mexPrintf("blob_set_data_multigpu: Number of syncs: %d\n", sync_vec->size());
	
	if (mxGetNumberOfElements(prhs[1]) != sync_vec->size())
		mexErrMsgTxt("blob_set_data_multigpu: input size should be equal to selected gpu number.\n");

	// set root solver
	const mxArray* const elem = mxGetCell(prhs[1], 0);

	mxCHECK(mxIsSingle(elem),"Input data should be single-precision float!!!\n");

	Blob<float>* blob = sync_ptr->solver()->net()->blobs()[blob_index].get();
	//mexPrintf("Size of data for each sync: %d\nSize of blob: %d\n", mxGetNumberOfElements(elem), blob->count());
	//mexPrintf("Blob index: %d\n", blob_index);
	mx_mat_to_blob(elem, blob, DATA);

	int initial_device;
	CUDA_CHECK(cudaGetDevice(&initial_device));

	for (int i = 1; i < sync_vec->size(); i++)
	{
		Solver<float> *solver = (*sync_vec)[i]->solver().get();
		Net<float> *net = solver->net().get();
		blob = net->blobs()[blob_index].get();
		//mexPrintf("sync %d: \tNumber of blobs: %d\n", i, net->blobs().size());

		const mxArray* const elem = mxGetCell(prhs[1], i);
		mxCHECK(mxIsSingle(elem), "Input data should be single-precision float!!!\n");
		//mexPrintf("Size of data for each sync: %d\nSize of blob: %d\n", mxGetNumberOfElements(elem), blob->count());
		//mexPrintf("Blob index: %d\n", blob_index);
		
		CUDA_CHECK(cudaSetDevice(solver->param().device_id()));
		mx_mat_to_blob(elem, blob, DATA);
		CUDA_CHECK(cudaSetDevice(initial_device));
		//(*sync_vec)[i]->solver_->net->blobs()[blob_index];
	}
}
예제 #2
0
// Usage: caffe_('net_get_attr', hNet)
static void net_get_attr(MEX_ARGS) {
	mxCHECK(nrhs == 1 && mxIsStruct(prhs[0]),
		"Usage: caffe_('net_get_attr', hNet)");
	Net<float>* net = handle_to_ptr<Net<float> >(prhs[0]);
	const int net_attr_num = 6;
	const char* net_attrs[net_attr_num] = { "hLayer_layers", "hBlob_blobs",
		"input_blob_indices", "output_blob_indices", "layer_names", "blob_names" };
	mxArray* mx_net_attr = mxCreateStructMatrix(1, 1, net_attr_num,
		net_attrs);
	mxSetField(mx_net_attr, 0, "hLayer_layers",
		ptr_vec_to_handle_vec<Layer<float> >(net->layers()));
	mxSetField(mx_net_attr, 0, "hBlob_blobs",
		ptr_vec_to_handle_vec<Blob<float> >(net->blobs()));
	mxSetField(mx_net_attr, 0, "input_blob_indices",
		int_vec_to_mx_vec(net->input_blob_indices()));
	mxSetField(mx_net_attr, 0, "output_blob_indices",
		int_vec_to_mx_vec(net->output_blob_indices()));
	mxSetField(mx_net_attr, 0, "layer_names",
		str_vec_to_mx_strcell(net->layer_names()));
	mxSetField(mx_net_attr, 0, "blob_names",
		str_vec_to_mx_strcell(net->blob_names()));
	plhs[0] = mx_net_attr;
}
예제 #3
0
EXPORT int caffe_net_blobs_size(void *netAnon)
{
	Net<float> *net = (Net<float> *)netAnon;
	return net->blobs().size();
}
예제 #4
0
EXPORT void *caffe_net_blob(void *netAnon, int i)
{
	Net<float> *net = (Net<float> *)netAnon;
	return net->blobs()[i].get();
}