Ginkgo package: add oneAPI support (#26868)

To use this, you can "spack install intel-oneapi-compilers" and then
"spack compiler add" the new compiler. You would need to install with
"spack install ginkgo+oneapi%dpcpp"
This commit is contained in:
Terry Cojean 2021-12-03 02:13:25 +01:00 committed by GitHub
parent fbd67feead
commit b80b085575
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 100 additions and 2 deletions

View File

@ -0,0 +1,70 @@
commit 83164570f0d3511d114114bcc2b02ad23b753ed0
Author: Yuhsiang M. Tsai <yhmtsai@gmail.com>
Date: Wed Oct 6 16:33:16 2021 +0200
syclstd 1.2.1 in new release to propagate subgroup
remove 64 subgroup in dense to avoid conj_trans issue on cpu temporarily
diff --git a/CMakeLists.txt b/CMakeLists.txt
index ceb269b1cb..b47388a596 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -67,7 +67,8 @@ if(MSVC)
elseif(GINKGO_BUILD_DPCPP OR CMAKE_CXX_COMPILER MATCHES "dpcpp")
# For now always use `-ffp-model=precise` with DPC++. This can be removed when
# the floating point issues are fixed.
- set(GINKGO_COMPILER_FLAGS "-Wpedantic;-ffp-model=precise" CACHE STRING
+ # -sycl-std=1.2.1 (or -sycl-std=2017) is temporary workaround after 2021.4 to propagate subgroup setting correctly
+ set(GINKGO_COMPILER_FLAGS "-Wpedantic;-ffp-model=precise;-sycl-std=1.2.1" CACHE STRING
"Set the required CXX compiler flags, mainly used for warnings. Current default is `-Wpedantic;-ffp-model=precise`")
else()
set(GINKGO_COMPILER_FLAGS "-Wpedantic" CACHE STRING
diff --git a/cmake/create_test.cmake b/cmake/create_test.cmake
index 9d22406f9a..dcc452b293 100644
--- a/cmake/create_test.cmake
+++ b/cmake/create_test.cmake
@@ -40,6 +40,7 @@ function(ginkgo_create_dpcpp_test test_name)
add_executable(${test_target_name} ${test_name}.dp.cpp)
target_compile_features(${test_target_name} PUBLIC cxx_std_17)
target_compile_options(${test_target_name} PRIVATE "${GINKGO_DPCPP_FLAGS}")
+ target_compile_options(${test_target_name} PRIVATE "${GINKGO_COMPILER_FLAGS}")
target_link_options(${test_target_name} PRIVATE -fsycl-device-code-split=per_kernel)
ginkgo_set_test_target_properties(${test_name} ${test_target_name})
# Note: MKL_ENV is empty on linux. Maybe need to apply MKL_ENV to all test.
diff --git a/dpcpp/CMakeLists.txt b/dpcpp/CMakeLists.txt
index fee9ec3639..ce71fd5d3c 100644
--- a/dpcpp/CMakeLists.txt
+++ b/dpcpp/CMakeLists.txt
@@ -68,6 +68,7 @@ target_compile_definitions(ginkgo_dpcpp PRIVATE GKO_COMPILING_DPCPP)
set(GINKGO_DPCPP_FLAGS ${GINKGO_DPCPP_FLAGS} PARENT_SCOPE)
target_compile_options(ginkgo_dpcpp PRIVATE "${GINKGO_DPCPP_FLAGS}")
+target_compile_options(ginkgo_dpcpp PRIVATE "${GINKGO_COMPILER_FLAGS}")
# Note: add MKL as PRIVATE not PUBLIC (MKL example shows) to avoid propagating
# find_package(MKL) everywhere when linking ginkgo (see the MKL example
# https://software.intel.com/content/www/us/en/develop/documentation/onemkl-windows-developer-guide/top/getting-started/cmake-config-for-onemkl.html)
diff --git a/dpcpp/matrix/dense_kernels.dp.cpp b/dpcpp/matrix/dense_kernels.dp.cpp
index 0c89530d1d..9a86ab9cd1 100644
--- a/dpcpp/matrix/dense_kernels.dp.cpp
+++ b/dpcpp/matrix/dense_kernels.dp.cpp
@@ -69,14 +69,14 @@ namespace dpcpp {
namespace dense {
+// Disable the 64 subgroup. CPU supports 64 now, but conj_transpose will
+// lead CL_OUT_OF_RESOURCES. TODO: investigate this issue.
using KCFG_1D = ConfigSet<11, 7>;
constexpr auto kcfg_1d_list =
- syn::value_list<std::uint32_t, KCFG_1D::encode(512, 64),
- KCFG_1D::encode(512, 32), KCFG_1D::encode(512, 16),
- KCFG_1D::encode(256, 32), KCFG_1D::encode(256, 16),
- KCFG_1D::encode(256, 8)>();
-constexpr auto subgroup_list =
- syn::value_list<std::uint32_t, 64, 32, 16, 8, 4>();
+ syn::value_list<std::uint32_t, KCFG_1D::encode(512, 32),
+ KCFG_1D::encode(512, 16), KCFG_1D::encode(256, 32),
+ KCFG_1D::encode(256, 16), KCFG_1D::encode(256, 8)>();
+constexpr auto subgroup_list = syn::value_list<std::uint32_t, 32, 16, 8, 4>();
constexpr auto kcfg_1d_array = syn::as_array(kcfg_1d_list);
constexpr int default_block_size = 256;

View File

@ -3,6 +3,7 @@
#
# SPDX-License-Identifier: (Apache-2.0 OR MIT)
import os
import sys
from spack import *
@ -31,6 +32,7 @@ class Ginkgo(CMakePackage, CudaPackage, ROCmPackage):
variant('shared', default=True, description='Build shared libraries')
variant('full_optimizations', default=False, description='Compile with all optimizations')
variant('openmp', default=sys.platform != 'darwin', description='Build with OpenMP')
variant('oneapi', default=False, description='Build with oneAPI support')
variant('develtools', default=False, description='Compile with develtools enabled')
variant('hwloc', default=False, description='Enable HWLOC support')
variant('build_type', default='Release',
@ -49,9 +51,13 @@ class Ginkgo(CMakePackage, CudaPackage, ROCmPackage):
depends_on('googletest', type="test")
depends_on('numactl', type="test", when="+hwloc")
depends_on('intel-oneapi-mkl', when="+oneapi")
depends_on('intel-oneapi-dpl', when="+oneapi")
conflicts('%gcc@:5.2.9')
conflicts("+rocm", when="@:1.1.1")
conflicts("+cuda", when="+rocm")
conflicts("+openmp", when="+oneapi")
# ROCm 4.1.0 breaks platform settings which breaks Ginkgo's HIP support.
conflicts("^hip@4.1.0:", when="@:1.3.0")
@ -63,18 +69,39 @@ class Ginkgo(CMakePackage, CudaPackage, ROCmPackage):
patch('1.4.0_skip_invalid_smoke_tests.patch', when='@master')
patch('1.4.0_skip_invalid_smoke_tests.patch', when='@1.4.0')
# Newer DPC++ compilers use the updated SYCL 2020 standard which change
# kernel attribute propagation rules. This doesn't work well with the
# initial Ginkgo oneAPI support.
patch('1.4.0_dpcpp_use_old_standard.patch', when='+oneapi @master')
patch('1.4.0_dpcpp_use_old_standard.patch', when='+oneapi @1.4.0')
def setup_build_environment(self, env):
spec = self.spec
if '+oneapi' in spec:
env.set('MKLROOT',
join_path(spec['intel-oneapi-mkl'].prefix,
'mkl', 'latest'))
env.set('DPL_ROOT',
join_path(spec['intel-oneapi-dpl'].prefix,
'dpl', 'latest'))
def cmake_args(self):
# Check that the have the correct C++ standard is available
if self.spec.satisfies('@:1.2.0'):
try:
self.compiler.cxx11_flag
except UnsupportedCompilerFlag:
InstallError('Ginkgo requires a C++11-compliant C++ compiler')
raise InstallError('Ginkgo requires a C++11-compliant C++ compiler')
else:
try:
self.compiler.cxx14_flag
except UnsupportedCompilerFlag:
InstallError('Ginkgo requires a C++14-compliant C++ compiler')
raise InstallError('Ginkgo requires a C++14-compliant C++ compiler')
cxx_is_dpcpp = os.path.basename(self.compiler.cxx) == "dpcpp"
if self.spec.satisfies('+oneapi') and not cxx_is_dpcpp:
raise InstallError("Ginkgo's oneAPI backend requires the" +
"DPC++ compiler as main CXX compiler.")
spec = self.spec
from_variant = self.define_from_variant
@ -85,6 +112,7 @@ def cmake_args(self):
from_variant('BUILD_SHARED_LIBS', 'shared'),
from_variant('GINKGO_JACOBI_FULL_OPTIMIZATIONS', 'full_optimizations'),
from_variant('GINKGO_BUILD_HWLOC', 'hwloc'),
from_variant('GINKGO_BUILD_DPCPP', 'oneapi'),
from_variant('GINKGO_DEVEL_TOOLS', 'develtools'),
# As we are not exposing benchmarks, examples, tests nor doc
# as part of the installation, disable building them altogether.