diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt
index 662172e92a38e4d8db1b9eb0321cc24c540f9a9d..255ff7220604d52eee119f009668779e330f7549 100644
--- a/src/CMakeLists.txt
+++ b/src/CMakeLists.txt
@@ -1,35 +1,79 @@
+## Specify the project
 cmake_minimum_required(VERSION 3.9 FATAL_ERROR)
 
+if(NOT CMAKE_CUDA_ARCHITECTURES)
+  set(CMAKE_CUDA_ARCHITECTURES 70 75)
+endif()
+
 # option(USE_CUDA "Use CUDA" ON)
 set(USE_CUDA ON)
 
 if(USE_CUDA)
-  # set the project name and version
   project(arbd VERSION 1.2 LANGUAGES CXX CUDA)
 else(USE_CUDA)
   project(arbd VERSION 1.2 LANGUAGES CXX)
 endif()
 
-# specify the C++ standard
+## specify the C++ standard
 set(CMAKE_CXX_STANDARD 14)
 set(CMAKE_CXX_STANDARD_REQUIRED True)
 set(CMAKE_VERBOSE_MAKEFILE True)
 
+# Set a default build type if none was specified
+set(default_build_type "Release")
+
+if(NOT CMAKE_BUILD_TYPE AND NOT CMAKE_CONFIGURATION_TYPES)
+  message(STATUS "Setting build type to '${default_build_type}' as none was specified.")
+  set(CMAKE_BUILD_TYPE "${default_build_type}" CACHE
+    STRING "Choose the type of build." FORCE)
+  # # Set the possible values of build type for cmake-gui
+  set_property(CACHE CMAKE_BUILD_TYPE PROPERTY STRINGS
+    "Debug" "Release" "RelWithDebInfo" "MinSizeRel")
+endif()
+
+
+
+if(CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
+  ## Some CMake uses -O2 for relase, override here
+  set(CMAKE_CXX_FLAGS_RELEASE "${CMAKE_CXX_FLAGS_RELEASE} -O3")
+
+  if( CMAKE_BUILD_TYPE STREQUAL "Release")
+    set( CMAKE_CUDA_FLAGS "${CMAKE_CUDA_FLAGS} -O3" )
+  endif()
+endif()
+
+
 ## OPTIONS
-option(USE_NCCL "Use NCCL for single node GPU peer communication" ON)
+option(USE_NCCL "Use NCCL for single node GPU peer communication" False)
+option(USE_NVTX "Build with NVTX profiling ranges" False)
+option(DEBUG "Build with debug flags" False)
+
+# (not yet optional) message(STATUS "USE_CUDA: ${USE_CUDA}")
+message(STATUS "USE_NCCL: ${USE_NCCL}")
+message(STATUS "USE_NVTX: ${USE_NVTX}")
+message(STATUS "DEBUG: ${DEBUG}")
+
 
+## Set flags before adding executable 
 # configure_file(TutorialConfig.h.in TutorialConfig.h)
-message(STATUS "USE_CUDA: ${USE_CUDA}")
 if(USE_CUDA)
   add_definitions(-DUSE_CUDA)
   ## CUDA_INCLUDE_DIRS wasn't getting set on my system with cmake 3.14.1, so check if in env
   if(DEFINED ENV{CUDA_INCLUDE_DIRS})
     set(CUDA_INCLUDE_DIRS $ENV{CUDA_INCLUDE_DIRS})
   endif()
-  message(STATUS "CUDA_INC: ${CUDA_INCLUDE_DIRS}")
+  # message(STATUS "CUDA_INC: ${CUDA_INCLUDE_DIRS}")
   include_directories(${CUDA_INCLUDE_DIRS})
 endif()
 
+if(USE_NVTX)
+  add_definitions(-DUSE_NVTX)
+endif()
+if(USE_NCCL)
+  add_definitions(-DUSE_NCCL)
+  target_link_libraries(arbd PRIVATE nccl)
+endif()
+
 ## Two lines below needed?
 set(CMAKE_CUDA_SEPARABLE_COMPILATION ON)
 set(CMAKE_POSITION_INDEPENDENT_CODE ON)
@@ -83,9 +127,12 @@ add_executable(arbd arbd.cpp
   useful.cu
   )
 
-target_link_libraries(arbd PRIVATE curand)
-
-message(STATUS "Run: ${MPIEXEC} ${MPIEXEC_NUMPROC_FLAG} ${MPIEXEC_MAX_NUMPROCS} ${MPIEXEC_PREFLAGS} EXECUTABLE ${MPIEXEC_POSTFLAGS} ARGS")
-## target_link_libraries(ARBD PUBLIC) MPI::MPI_CXX)
+## Add optional libraries
+if(USE_CUDA)
+  target_link_libraries(arbd PRIVATE curand)
+endif()
+if(USE_NCCL)
+  target_link_libraries(arbd PRIVATE nccl)
+endif()
 
 install(TARGETS arbd)