Files
paddlepaddle--paddle/cmake/external/magma.cmake
T
2026-07-13 12:40:42 +08:00

130 lines
4.0 KiB
CMake

# Copyright (c) 2025 PaddlePaddle Authors. All Rights Reserved.
#
# Licensed under the Apache License, Version 2.0 (the "License");
# you may not use this file except in compliance with the License.
# You may obtain a copy of the License at
#
# http://www.apache.org/licenses/LICENSE-2.0
#
# Unless required by applicable law or agreed to in writing, software
# distributed under the License is distributed on an "AS IS" BASIS,
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
# See the License for the specific language governing permissions and
# limitations under the License.
include(ExternalProject)
set(MAGMA_PREFIX_DIR ${THIRD_PARTY_PATH}/magma)
set(MAGMA_DOWNLOAD_DIR
${PADDLE_SOURCE_DIR}/third_party/magma/${CMAKE_SYSTEM_NAME})
set(MAGMA_INSTALL_DIR ${THIRD_PARTY_PATH}/install/magma)
set(MAGMA_LIB_DIR ${MAGMA_INSTALL_DIR}/lib)
# Note(zhouwei): magma need fortran compiler which many machines don't have, so use precompiled library.
# use magma tag v2.9.0 on 07/28/2025 https://github.com/icl-utk-edu/magma/tree/v2.9.0
if(LINUX)
if(WITH_GPU)
execute_process(
COMMAND ${CMAKE_CUDA_COMPILER} --list-gpu-arch
OUTPUT_VARIABLE CUDA_ARCH_LIST
OUTPUT_STRIP_TRAILING_WHITESPACE)
message(STATUS "Detected CUDA architectures: ${CUDA_ARCH_LIST}")
set(MAGMA_ARCH "sm_70")
set(MAGMA_URL_MD5 "649b886f9df75face6aa98015ccb1885")
if(CUDA_ARCH_LIST MATCHES "compute_80")
set(MAGMA_ARCH "sm_80")
set(MAGMA_URL_MD5 "c16079b2eaf48f5af741d979c5090667")
endif()
execute_process(
COMMAND nvcc -V
OUTPUT_VARIABLE NVCC_VERSION_RAW
OUTPUT_STRIP_TRAILING_WHITESPACE)
string(REGEX MATCH "release ([0-9]+)\\.([0-9]+)" _ ${NVCC_VERSION_RAW})
set(CUDA_MAJOR ${CMAKE_MATCH_1})
set(CUDA_MINOR ${CMAKE_MATCH_2})
if(CUDA_MAJOR EQUAL 12 AND CUDA_MINOR EQUAL 0)
set(MAGMA_ARCH "cuda120")
set(MAGMA_URL_MD5 "a00f89aeb81f0373aac34684695847ab")
endif()
endif()
if(WITH_XPU)
set(MAGMA_ARCH "xpu")
set(MAGMA_URL_MD5 "889f990bfd4a24c98831cfda0243674a")
endif()
if(WITH_ROCM)
set(MAGMA_ARCH "hip")
set(MAGMA_URL_MD5 "f4fbe46c665819f6ae86d1aa447d07b5")
endif()
message(STATUS "Selected MAGMA architecture: ${MAGMA_ARCH}")
message(STATUS "Selected MAGMA URL MD5: ${MAGMA_URL_MD5}")
set(MAGMA_FILE
"magma_lnx_${MAGMA_ARCH}_v2.9.0.20250728.tar.gz"
CACHE STRING "" FORCE)
set(MAGMA_URL
"https://paddlepaddledeps.bj.bcebos.com/${MAGMA_FILE}"
CACHE STRING "" FORCE)
set(MAGMA_LIB "${MAGMA_LIB_DIR}/libmagma.so")
elseif(WIN32)
message("magma do not support windows yet, skip ...")
else() # MacOS
message("magma do not support macos or other platform yet, skip ...")
endif()
function(download_magma)
message(
STATUS "Downloading ${MAGMA_URL} to ${MAGMA_DOWNLOAD_DIR}/${MAGMA_FILE}")
# NOTE: If the version is updated, consider emptying the folder; maybe add timeout
file(
DOWNLOAD ${MAGMA_URL} ${MAGMA_DOWNLOAD_DIR}/${MAGMA_FILE}
EXPECTED_MD5 ${MAGMA_URL_MD5}
STATUS ERR)
if(ERR EQUAL 0)
message(STATUS "Download ${MAGMA_FILE} success")
else()
message(
FATAL_ERROR
"Download failed, error: ${ERR}\n You can try downloading ${MAGMA_FILE} again"
)
endif()
endfunction()
# Download and check magma.
if(EXISTS ${MAGMA_DOWNLOAD_DIR}/${MAGMA_FILE})
file(MD5 ${MAGMA_DOWNLOAD_DIR}/${MAGMA_FILE} MAGMA_MD5)
if(NOT MAGMA_MD5 STREQUAL MAGMA_URL_MD5)
# clean build file
file(REMOVE_RECURSE ${MAGMA_PREFIX_DIR})
file(REMOVE_RECURSE ${MAGMA_INSTALL_DIR})
download_magma()
endif()
else()
download_magma()
endif()
ExternalProject_Add(
extern_magma
${EXTERNAL_PROJECT_LOG_ARGS}
URL ${MAGMA_DOWNLOAD_DIR}/${MAGMA_FILE}
URL_MD5 ${MAGMA_URL_MD5}
DOWNLOAD_DIR ${MAGMA_DOWNLOAD_DIR}
SOURCE_DIR ${MAGMA_LIB_DIR}
PREFIX ${MAGMA_PREFIX_DIR}
DOWNLOAD_NO_PROGRESS 1
PATCH_COMMAND ""
UPDATE_COMMAND ""
CONFIGURE_COMMAND ""
BUILD_COMMAND ""
INSTALL_COMMAND ""
BUILD_BYPRODUCTS ${MAGMA_LIB})
if(WITH_MAGMA)
add_definitions(-DPADDLE_WITH_MAGMA)
endif()