@@ -769,6 +769,99 @@ if (LLAMA_CPU_HBM)
769769 target_link_libraries (ggml PUBLIC memkind)
770770endif ()
771771
772+ if (LLAMA_CANN)
773+ if ("cann${CANN_INSTALL_DIR} " STREQUAL "cann" AND DEFINED ENV{ASCEND_TOOLKIT_HOME})
774+ set (CANN_INSTALL_DIR $ENV{ASCEND_TOOLKIT_HOME} )
775+ message (STATUS "CANN: updated CANN_INSTALL_DIR from ASCEND_TOOLKIT_HOME=$ENV{ASCEND_TOOLKIT_HOME} " )
776+ endif ()
777+
778+ if (CANN_INSTALL_DIR)
779+ # Only Support Linux.
780+ if (LLAMA_CANN)
781+ if (NOT UNIX )
782+ set (LLAMA_CANN OFF )
783+ message (WARNING "CANN: CANN toolkit supports unix but not ${CMAKE_SYSTEM_NAME} . Turning off LLAMA_CANN" )
784+ endif ()
785+ endif ()
786+
787+ # Supported platforms: x86-64, arm64
788+ if (LLAMA_CANN)
789+ if (CMAKE_SYSTEM_PROCESSOR STREQUAL "aarch64" )
790+ elseif (CMAKE_SYSTEM_PROCESSOR STREQUAL "x86_64" OR CMAKE_SYSTEM_PROCESSOR STREQUAL "amd64" )
791+ else ()
792+ set (LLAMA_CANN OFF )
793+ message (WARNING "CANN: CANN toolkit supports x86-64 and arm64 but not ${CMAKE_SYSTEM_PROCESSOR} . Turning off LLAMA_CANN" )
794+ endif ()
795+ endif ()
796+
797+ # Set headers
798+ set (CANN_INCLUDE_DIRS "${CANN_INSTALL_DIR} /include" "${CANN_INSTALL_DIR} /include/aclnn" )
799+ # Find libs
800+ set (CANN_LIBRARIES "" )
801+ # TODO: optimize find libs.
802+ # * libascendcl.so
803+ if (LLAMA_CANN)
804+ set (lib_dir "${CANN_INSTALL_DIR} /acllib/lib64" )
805+ find_library (found_lib_ascendcl NAMES ascendcl PATHS ${lib_dir} NO_DEFAULT_PATH)
806+ if (found_lib_ascendcl)
807+ set (lib_ascendcl ${found_lib_ascendcl} )
808+ list (APPEND CANN_LIBRARIES ${lib_ascendcl} )
809+ message (STATUS "CANN: libascendcl.so is found at ${lib_dir} " )
810+ else ()
811+ set (LLAMA_CANN OFF )
812+ message (WARNING "CANN: Missing libascendcl.so. Turning off LLAMA_CANN" )
813+ endif ()
814+ endif ()
815+
816+ # * libnnopbase.so
817+ if (LLAMA_CANN)
818+ set (lib_dir "${CANN_INSTALL_DIR} /acllib/lib64" )
819+ find_library (found_lib_nnopbase NAMES nnopbase PATHS ${lib_dir} NO_DEFAULT_PATH)
820+ if (found_lib_nnopbase)
821+ set (lib_nnopbase ${found_lib_nnopbase} )
822+ list (APPEND CANN_LIBRARIES ${lib_nnopbase} )
823+ message (STATUS "CANN: libnnopbase.so is found at ${lib_dir} " )
824+ else ()
825+ set (LLAMA_CANN OFF )
826+ message (WARNING "CANN: Missing libnnopbase.so. Turning off LLAMA_CANN" )
827+ endif ()
828+ endif ()
829+
830+ # * libopapi.so
831+ if (LLAMA_CANN)
832+ set (lib_dir "${CANN_INSTALL_DIR} /lib64" )
833+ find_library (found_lib_opapi NAMES opapi PATHS ${lib_dir} NO_DEFAULT_PATH)
834+ if (found_lib_opapi)
835+ set (lib_opapi ${found_lib_opapi} )
836+ list (APPEND CANN_LIBRARIES ${lib_opapi} )
837+ message (STATUS "CANN: libopapi.so is found at ${lib_dir} " )
838+ else ()
839+ set (LLAMA_CANN OFF )
840+ message (WARNING "CANN: Missing libopapi.so. Turning off LLAMA_CANN" )
841+ endif ()
842+ endif ()
843+
844+ # Set headers and libs
845+ if (LLAMA_CANN)
846+ message (STATUS "CANN: CANN_INCLUDE_DIRS = ${CANN_INCLUDE_DIRS} " )
847+ message (STATUS "CANN: CANN_LIBRARIES = ${CANN_LIBRARIES} " )
848+ set (GGML_HEADERS_CANN ggml-cann.h)
849+ file (GLOB GGML_SOURCES_CUDA "ggml-cann/*.cpp" )
850+ list (APPEND GGML_SOURCES_CANN "ggml-cann.cpp" )
851+ set (LLAMA_EXTRA_LIBS ${LLAMA_EXTRA_LIBS} ${CANN_LIBRARIES} )
852+ set (LLAMA_EXTRA_INCLUDES ${LLAMA_EXTRA_INCLUDES} ${CANN_INCLUDE_DIRS} )
853+ add_compile_definitions (GGML_USE_CANN)
854+ endif ()
855+ else ()
856+ set (LLAMA_CANN OFF )
857+ message (WARNING "CANN: Can't find CANN_INSTALL_DIR, do you forget to source set_var.sh. Turning off LLAMA_CANN" )
858+ endif ()
859+
860+ if (NOT LLAMA_CANN)
861+ message (WARNING "CANN: LLAMA_CANN is turned OFF, see above for details." )
862+ endif ()
863+ endif ()
864+
772865if (LLAMA_PERF)
773866 add_compile_definitions (GGML_PERF)
774867endif ()
@@ -1147,6 +1240,7 @@ add_library(ggml OBJECT
11471240 ${GGML_SOURCES_KOMPUTE} ${GGML_HEADERS_KOMPUTE}
11481241 ${GGML_SOURCES_VULKAN} ${GGML_HEADERS_VULKAN}
11491242 ${GGML_SOURCES_ROCM} ${GGML_HEADERS_ROCM}
1243+ ${GGML_SOURCES_CANN} ${GGML_HEADERS_CANN}
11501244 )
11511245
11521246target_include_directories (ggml PUBLIC . ${LLAMA_EXTRA_INCLUDES} )
0 commit comments