 			block = (h_network->_layers[l]._X_size < MAX_NB_THREADS ? h_network->_layers[l]._X_size : MAX_NB_THREADS);
 			grid = h_network->_layers[l]._X_size / MAX_NB_THREADS + (h_network->_layers[l]._X_size%MAX_NB_THREADS ? 1 : 0);
 			gpu_propagateBackFirstDerivate_setXError<<<grid, block>>>(d_network, out_set, out_elt_size, idx, l);
-			cudaDeviceSynchronize();
 		}
 
 		// _d_E_Y[l] = _d_E_X[l] * derived_sigmoid(_X[l])
 		block = (h_network->_layers[l]._Y_size < MAX_NB_THREADS ? h_network->_layers[l]._Y_size : MAX_NB_THREADS);
 		grid = h_network->_layers[l]._Y_size / MAX_NB_THREADS + (h_network->_layers[l]._Y_size%MAX_NB_THREADS ? 1 : 0);
 		gpu_propagateBackFirstDerivate_setYError<<<grid, block>>>(d_network, l);
-		cudaDeviceSynchronize();
 
 		// _d_E_W[l-1] = _d_E_Y[l] * _X[l-1]
 		// _W[l-1] = _W[l-1] - _eta * _d_E_W[l-1]

	block = (h_network->_layers[0]._X_size < MAX_NB_THREADS ? h_network->_layers[0]._X_size : MAX_NB_THREADS);
	grid = h_network->_layers[0]._X_size / MAX_NB_THREADS + (h_network->_layers[0]._X_size%MAX_NB_THREADS ? 1 : 0);
	gpu_propagateFront_setInput<<<grid, block>>>(d_network, in_set, in_elt_size, idx);
	cudaDeviceSynchronize();

	cublasStatus_t	stat;
	cublasHandle_t handle;

	struct layer* _layers;
};

const int EPOCH=1;

static std::string getCurrentTime() {
	time_t rawtime;
