 	dim3 dimBlockA(1, 1); // @TODO Optimierungspotential; groessere Werte sind kleinere Gridsize
 	dim3 dimGridA(MatrixA.cols / dimBlockA.x, MatrixAp.rows / dimBlockA.y);
 
+	cudaThreadSynchronize();
 
 	for(i = 1; i <= synth.blocksize; i++) {
 		
-		//MatrixMultiplyKernel<<<dimGridCA, dimBlockCA, 1, streams[0]>>>(device_MatrixC, *pointer_device_MatrixAp_read, *pointer_device_MatrixCA_line_write);
+		MatrixMultiplyKernel<<<dimGridCA, dimBlockCA, 1, streams[0]>>>(device_MatrixC, *pointer_device_MatrixAp_read, *pointer_device_MatrixCA_line_write);
 		// m_multiply(&MatrixC, pointer_MatrixAp, &MatrixCA_line);
 
 		MatrixMultiplyKernel<<<dimGridA, dimBlockA, 1, streams[2]>>>(*pointer_device_MatrixAp_read, device_MatrixA, *pointer_device_MatrixAp_write);

		m_swap(&pointer_device_MatrixAp_write, &pointer_device_MatrixAp_read);
		m_swap(&pointer_device_MatrixCA_line_write, &pointer_device_MatrixCA_line_read);

		//CUDA_SAFE_CALL(cudaMemcpyAsync(&device_MatrixCA.elements[(i-1) * MatrixCA.cols], pointer_device_MatrixCA_line_read->elements, m_size(&device_MatrixCA_line_read), cudaMemcpyDeviceToDevice, streams[1]));
	}

	cudaThreadSynchronize();


	dim3 dimBlockA(1, 1); // @TODO Optimierungspotential; groessere Werte sind kleinere Gridsize
	dim3 dimGridA(state.cols / dimBlockA.x, MatrixAp.rows / dimBlockA.y);

	cudaThreadSynchronize();

	for(i = -synth.blocksize; i < synth.samples;) {
		/*
