8000 solve apl dependency issue (#145215) · pytorch/pytorch@0674ab7 · GitHub
[go: up one dir, main page]

Skip to content

Commit 0674ab7

Browse files
alinpahontu2912ozanMSFT
authored andcommitted
solve apl dependency issue (#145215)
According to the [APL documentation](https://developer.arm.com/documentation/101004/2404/General-information/Arm-Performance-Libraries-example-programs), libraries ending with _mp are OpenMP multi-threaded libraries. When a project is compiled with MSVC and the -openmp flag, the vcomp library (Visual C++ implementation of OpenMP) is used for runtime calls. However, the current APL implementation uses the libomp.dll (LLVM) variant. As a result, there are unexpected behaviors at runtime. --- For Example: ```python import torch # Create a sparse tensor # Input (Sparse Tensor): # [[0, 1], # [1, 0]] indices = torch.tensor([[0, 1], [1, 0]]) values = torch.tensor([1, 1], dtype=torch.float32) size = torch.Size([2, 2]) sparse_tensor = torch.sparse_coo_tensor(indices, values, size) # Convert sparse tensor to dense tensor dense_tensor = sparse_tensor.to_dense() # Expected Output (Dense Tensor): # [[0, 1], # [1, 0]] print("\nDense Tensor:") print(dense_tensor) ``` However, it prints unexpected outputs such as: ```python # [[0, 11], # [10, 0]] ``` The issue arises because the following code does not function as expected at runtime: https://github.com/pytorch/pytorch/blob/main/aten/src/ATen/ParallelOpenMP.h#L30 ```c++ // returns 1 , however since OpenMP is enabled it should return total number of threads int64_t num_threads = omp_get_num_threads(); ``` --- In the runtime, loading multiple OpenMP libraries (in this case `libomp` and `vcomp`) is causing unexpected behaviours. So, we've changed libraries from `_mp` to non `_mp` versions and we used `vcomp` for OpenMP calls. Pull Request resolved: #145215 Approved by: https://github.com/ozanMSFT, https://github.com/malfet Co-authored-by: Ozan Aydin <148207261+ozanMSFT@users.noreply.github.com>
1 parent 7b6029d commit 0674ab7

File tree

2 files changed

+30
-4
lines changed

2 files changed

+30
-4
lines changed

cmake/Modules/FindAPL.cmake

Lines changed: 20 additions & 4 deletions
10000
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010

1111
SET(APL_INCLUDE_SEARCH_PATHS $ENV{ARMPL_DIR}/include)
1212
SET(APL_LIB_SEARCH_PATHS $ENV{ARMPL_DIR}/lib)
13+
SET(APL_BIN_SEARCH_PATHS $ENV{ARMPL_DIR}/bin)
1314

1415
SET(APL_FOUND ON)
1516

@@ -21,21 +22,36 @@ IF(NOT APL_INCLUDE_DIR)
2122
ENDIF()
2223

2324
# Check lib file
24-
FIND_PATH(APL_LIB_DIR NAMES libarmpl_lp64_mp.dll.lib libomp.dll.lib libarmpl_lp64_mp.a PATHS ${APL_LIB_SEARCH_PATHS})
25+
FIND_PATH(APL_LIB_DIR NAMES armpl_lp64.dll.lib libarmpl_lp64.a PATHS ${APL_LIB_SEARCH_PATHS})
2526
IF(NOT APL_LIB_DIR)
2627
SET(APL_FOUND OFF)
2728
MESSAGE(STATUS "Could not verify APL lib directory. Turning APL_FOUND off")
2829
ENDIF()
2930

31+
# Check bin file
32+
FIND_PATH(APL_BIN_DIR NAMES armpl_lp64.dll libarmpl_lp64.a PATHS ${APL_BIN_SEARCH_PATHS})
33+
IF(NOT APL_BIN_DIR)
34+
SET(APL_FOUND OFF)
35+
MESSAGE(STATUS "Could not verify APL bin directory. Turning APL_FOUND off")
36+
ENDIF()
37+
3038
IF (APL_FOUND)
3139
IF(WIN32)
3240
set(APL_LIBRARIES
33-
"${APL_LIB_DIR}/libarmpl_lp64_mp.dll.lib"
34-
"${APL_LIB_DIR}/libomp.dll.lib"
41+
"${APL_LIB_DIR}/armpl_lp64.dll.lib"
42+
)
43+
set(APL_DLLS
44+
"${CMAKE_INSTALL_PREFIX}/lib/armpl_lp64.dll"
45+
)
46+
add_custom_command(
47+
OUTPUT ${APL_DLLS}
48+
COMMAND ${CMAKE_COMMAND} -E make_directory "${CMAKE_INSTALL_PREFIX}/lib"
49+
COMMAND ${CMAKE_COMMAND} -E copy_if_different "${APL_BIN_DIR}/armpl_lp64.dll" "${CMAKE_INSTALL_PREFIX}/lib/armpl_lp64.dll"
3550
)
51+
add_custom_target(copy_apl_dlls ALL DEPENDS ${APL_DLLS})
3652
ELSEIF(UNIX)
3753
set(APL_LIBRARIES
38-
"${APL_LIB_DIR}/libarmpl_lp64_mp.a"
54+
"${APL_LIB_DIR}/libarmpl_lp64.a"
3955
)
4056
ENDIF()
4157
MESSAGE(STATUS "Found APL header: ${APL_INCLUDE_DIR}")

cmake/Modules/FindOpenMP.cmake

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -254,6 +254,16 @@ function(_OPENMP_GET_FLAGS LANG FLAG_MODE OPENMP_FLAG_VAR OPENMP_LIB_NAMES_VAR)
254254
set(OpenMP_libomp_LIBRARY "${MKL_OPENMP_LIBRARY}" CACHE STRING "libomp location for OpenMP")
255255
endif()
256256

257+
if ((NOT OpenMP_libomp_LIBRARY) AND MSVC AND CMAKE_SYSTEM_PROCESSOR STREQUAL "ARM64")
258+
# On MSVC ARM64, OpenMP is provided by vcomp, which is a part of the Visual Studio installation.
259+
find_library(OpenMP_libomp_LIBRARY
260+
NAMES vcomp
261+
HINTS ${CMAKE_${LANG}_IMPLICIT_LINK_DIRECTORIES}
262+
DOC "vcomp location for OpenMP on MSVC ARM64"
263+
)
264+
mark_as_advanced(OpenMP_libomp_LIBRARY)
265+
endif()
266+
257267
if (NOT OpenMP_libomp_LIBRARY)
258268
find_library(OpenMP_libomp_LIBRARY
259269
NAMES omp gomp iomp5

0 commit comments

Comments
 (0)
0