diff --git a/CMakeLists.txt b/CMakeLists.txt
index 91b0a1866ad4835bbdc3db6aec2a8c91a39770a9..041c025c3bd1725bcecda9ebb02d959ff19cff07 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -51,7 +51,7 @@ if(WITH_MPI)
 endif()
 
 # Profiler support
-set(WITH_PROFILING OFF CACHE BOOL "use built in profiling of miniapp" )
+set(WITH_PROFILING OFF CACHE BOOL "use built-in profiling of miniapp" )
 if(WITH_PROFILING)
     add_definitions(-DWITH_PROFILING)
 endif()
@@ -62,28 +62,19 @@ if(SYSTEM_CRAY)
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -dynamic")
 endif()
 
-# KNL target
-set(TARGET_KNL OFF CACHE BOOL "target Intel KNL architecture")
-if(TARGET_KNL)
+# vectorization target
+set(VECTORIZE_TARGET "none" CACHE STRING "CPU target for vectorization {KNL,AVX,AVX2}")
+
+if(VECTORIZE_TARGET STREQUAL "KNL")
     set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_KNL}")
+elseif(VECTORIZE_TARGET STREQUAL "AVX")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_AVX}")
+elseif(VECTORIZE_TARGET STREQUAL "AVX2")
+    set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${CXXOPT_AVX2}")
 endif()
 
-# vectorization
-set(TARGET_VECTORIZE OFF CACHE BOOL "generate optimized code that vectorizes with the Intel compiler")
-
-# targets for extermal dependencies
-include(ExternalProject)
-externalproject_add(modparser
-    PREFIX ${CMAKE_BINARY_DIR}/external
-    CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/external"
-               "-DCMAKE_CXX_FLAGS=${SAVED_CXX_FLAGS}"
-               "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
-    BINARY_DIR "${CMAKE_BINARY_DIR}/external/modparser"
-    STAMP_DIR  "${CMAKE_BINARY_DIR}/external/"
-    TMP_DIR    "${CMAKE_BINARY_DIR}/external/tmp"
-    SOURCE_DIR "${CMAKE_SOURCE_DIR}/external/modparser"
-    )
-
+# whether to generate optimized kernels from NMODL
+set(USE_OPTIMIZED_KERNELS OFF CACHE BOOL "generate optimized code that vectorizes with the Intel compiler")
 
 include_directories(${CMAKE_SOURCE_DIR}/external)
 include_directories(${CMAKE_SOURCE_DIR}/external/tclap/include)
@@ -91,7 +82,6 @@ include_directories(${CMAKE_SOURCE_DIR}/include)
 include_directories(${CMAKE_SOURCE_DIR}/src)
 include_directories(${CMAKE_SOURCE_DIR}/miniapp)
 include_directories(${CMAKE_SOURCE_DIR})
-
 if( "${WITH_TBB}" STREQUAL "ON" )
     include_directories(${TBB_INCLUDE_DIRS})
 endif()
diff --git a/cmake/CompilerOptions.cmake b/cmake/CompilerOptions.cmake
index 6dc09b961cc6a71ce69b1bf9cba5d6821e6949e8..c92c14c45eea9f6969c6395bc67964fa37f16b30 100644
--- a/cmake/CompilerOptions.cmake
+++ b/cmake/CompilerOptions.cmake
@@ -17,8 +17,9 @@ if(${CMAKE_CXX_COMPILER_ID} MATCHES "GNU")
 
     # compiler flags for generating KNL-specific AVX512 instructions
     # supported in gcc 4.9.x and later
-    #set(CXXOPT_KNL "-mavx512f")
     set(CXXOPT_KNL "-march=knl")
+    set(CXXOPT_AVX "-mavx")
+    set(CXXOPT_AVX2 "-march=core-avx2")
 endif()
 
 if(${CMAKE_CXX_COMPILER_ID} MATCHES "Intel")
@@ -29,5 +30,7 @@ if(${CMAKE_CXX_COMPILER_ID} MATCHES "Intel")
 
     # compiler flags for generating KNL-specific AVX512 instructions
     set(CXXOPT_KNL "-xMIC-AVX512")
+    set(CXXOPT_AVX "-mavx")
+    set(CXXOPT_AVX2 "-march=core-avx2")
 endif()
 
diff --git a/mechanisms/CMakeLists.txt b/mechanisms/CMakeLists.txt
index 9dded83451d6f5f61721b5fe316447988226f1e4..ace3ccda304be110d1cc65b215986759c88647b3 100644
--- a/mechanisms/CMakeLists.txt
+++ b/mechanisms/CMakeLists.txt
@@ -1,19 +1,58 @@
-set(mechanisms pas hh expsyn exp2syn)
 
-set(modcc "${CMAKE_BINARY_DIR}/external/bin/modcc")
+# Only build modcc if it has not already been installed.
+# This is useful if cross compiling for KNL, when it is not desirable to compile
+# modcc with the same flags that are used for the KNL target.
+find_program(MODCC_BIN modcc)
+set(modcc "${MODCC_BIN}")
+set(use_external_modcc OFF BOOL)
+
+# the modcc executable was not found, so build our own copy
+if(MODCC_BIN STREQUAL "MODCC_BIN-NOTFOUND")
+    include(ExternalProject)
+    externalproject_add(modparser
+        PREFIX ${CMAKE_BINARY_DIR}/external
+        CMAKE_ARGS "-DCMAKE_INSTALL_PREFIX=${CMAKE_BINARY_DIR}/external"
+                   "-DCMAKE_CXX_FLAGS=${SAVED_CXX_FLAGS}"
+                   "-DCMAKE_CXX_COMPILER=${CMAKE_CXX_COMPILER}"
+        BINARY_DIR "${CMAKE_BINARY_DIR}/external/modparser"
+        STAMP_DIR  "${CMAKE_BINARY_DIR}/external/"
+        TMP_DIR    "${CMAKE_BINARY_DIR}/external/tmp"
+        SOURCE_DIR "${CMAKE_SOURCE_DIR}/external/modparser"
+    )
+    # Set up environment to use the version of modcc that is compiled
+    # as the ExternalProject above.
+    set(use_external_modcc ON)
+    set(modcc "${CMAKE_BINARY_DIR}/external/bin/modcc")
+endif()
+
+# the list of built-in mechanisms to be provided by default
+set(mechanisms pas hh expsyn exp2syn)
 
+# set the flags for the modcc compiler that converts NMODL
+# files to C++/CUDA source.
 set(modcc_flags "-t cpu")
-if(TARGET_VECTORIZE)
-    set(modcc_flags ${modcc_flags}  -O)
+if(USE_OPTIMIZED_KERNELS) # generate optimized kernels
+    set(modcc_flags ${modcc_flags} -O)
 endif()
 
+# generate source for each mechanism
 foreach(mech ${mechanisms})
     set(mod "${CMAKE_CURRENT_SOURCE_DIR}/mod/${mech}.mod")
     set(hpp "${CMAKE_CURRENT_SOURCE_DIR}/${mech}.hpp")
-    add_custom_command(OUTPUT "${hpp}"
-                       DEPENDS modparser "${mod}"
-                       WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
-                       COMMAND ${modcc} ${modcc_flags} ${mod} -o ${hpp})
+    if(use_external_modcc)
+        add_custom_command(
+           OUTPUT "${hpp}"
+           WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+           COMMAND ${modcc} ${modcc_flags} ${mod} -o ${hpp}
+       )
+    else()
+        add_custom_command(
+            OUTPUT "${hpp}"
+            DEPENDS modparser "${mod}"
+            WORKING_DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}"
+            COMMAND ${modcc} ${modcc_flags} ${mod} -o ${hpp}
+        )
+    endif()
     set_source_files_properties("${hpp}" PROPERTIES GENERATED TRUE)
     list(APPEND all_mod_hpps "${hpp}")
 endforeach()