   
   //cudaError_t err;
   cublasStatus_t status;
-
+  int AsyncEngineCount, devID;
+  check_error( cudaGetDevice(&devID), CUBLAS_STATUS_EXECUTION_FAILED);
+  check_error( cudaDeviceGetAttribute(&AsyncEngineCount, cudaDevAttrAsyncEngineCount, devID), CUBLAS_STATUS_EXECUTION_FAILED);
+  bool DO_INLINE_BOUT = AsyncEngineCount > 1;
+  
   check_error( cudaMalloc( (void**)&Ad, (Am*An)*sizeof(T) ), CUBLAS_STATUS_EXECUTION_FAILED);
   check_error( cudaMalloc( (void**)&Bd, (Bm*Bn)*sizeof(T) ), CUBLAS_STATUS_EXECUTION_FAILED);
 
   //setup streams
   cudaStream_t inStream, outStream;
   check_error( cudaStreamCreateWithFlags( &inStream, cudaStreamNonBlocking), CUBLAS_STATUS_EXECUTION_FAILED );
-  check_error( cudaStreamCreateWithFlags( &outStream, cudaStreamNonBlocking), CUBLAS_STATUS_EXECUTION_FAILED );
+  if(DO_INLINE_BOUT)
+    check_error( cudaStreamCreateWithFlags( &outStream, cudaStreamNonBlocking), CUBLAS_STATUS_EXECUTION_FAILED );
   
   //call cpu API trmm
   check_error( 

        if(Bout){
          check_error( cudaEventRecord(eComp, strComp), CUBLAS_STATUS_INTERNAL_ERROR);
          check_error( cudaStreamWaitEvent(strOut, eComp, 0), CUBLAS_STATUS_INTERNAL_ERROR);
          //check_error( (status = cublasGetMatrixAsync( m1, n, sizeof(T), Bd, incB, Bc, incB, strOut )), status);
        }

        //B is already in, no need to copy in

{
  T one = make_one<T>();
  cublasStatus_t status;
  cudaEvent_t eAin, eComp;
  check_error( cudaEventCreateWithFlags(&eAin, cudaEventDisableTiming), CUBLAS_STATUS_EXECUTION_FAILED);
  check_error( cudaEventCreateWithFlags(&eComp, cudaEventDisableTiming), CUBLAS_STATUS_EXECUTION_FAILED);
  cudaStream_t strComp;
