Skip to content

Commit 1ffff27

Browse files
committed
compiler: Switch to oneapi compiler
1 parent d4619de commit 1ffff27

File tree

5 files changed

+57
-8
lines changed

5 files changed

+57
-8
lines changed

devito/arch/compiler.py

Lines changed: 43 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@
1212
from codepy.jit import compile_from_string
1313
from codepy.toolchain import GCCToolchain
1414

15-
from devito.arch import (AMDGPUX, Cpu64, M1, NVIDIAX, SKX, POWER8, POWER9,
15+
from devito.arch import (AMDGPUX, NVIDIAX, M1, SKX, POWER8, POWER9, INTELGPUX,
1616
get_nvidia_cc, check_cuda_runtime, get_m1_llvm_path)
1717
from devito.exceptions import CompilationError
1818
from devito.logger import debug, warning, error
@@ -515,19 +515,55 @@ def __lookup_cmds__(self):
515515
self.MPICXX = 'mpicxx'
516516

517517

518-
class ICXCompiler(Compiler):
518+
class OneapiCompiler(Compiler):
519519

520520
def __init__(self, *args, **kwargs):
521521
super().__init__(*args, **kwargs)
522522

523-
self.cflags += ['-Ofast', '-xHost', '-fiopenmp']
523+
language = kwargs.pop('language', configuration['language'])
524+
platform = kwargs.pop('platform', configuration['platform'])
525+
526+
self.cflags.append("-xHost")
527+
self.cflags.append("-qopt-zmm-usage=high")
528+
529+
if configuration['safe-math']:
530+
self.cflags.append("-fp-model=strict")
531+
else:
532+
self.cflags.append('-fast')
533+
534+
if language == 'sycl':
535+
self.cflags.append('-fsycl')
536+
if platform is NVIDIAX:
537+
self.cflags.append('-fsycl-targets=nvptx64-cuda')
538+
else:
539+
self.cflags.append('-fsycl-targets=spir64')
540+
541+
if language == 'openmp':
542+
self.cflags.append('-qopenmp')
543+
if platform is NVIDIAX:
544+
self.cflags.append('-fopenmp-targets=nvptx64-cuda')
545+
if platform is INTELGPUX:
546+
self.cflags.append('-fopenmp-targets=spir64')
547+
self.cflags.append('-fopenmp-target-simd')
548+
549+
if platform is INTELGPUX:
550+
self.cflags.remove('-g') # -g disables some optimizations in IGC
551+
self.cflags.append('-gline-tables-only')
552+
self.cflags.append('-fdebug-info-for-profiling')
553+
554+
# Make sure the MPI compiler uses `icx` underneath -- whatever the MPI distro is
555+
if kwargs.get('mpi'):
556+
ver = check_output([self.MPICC, "--version"]).decode("utf-8")
557+
if not ver.startswith("Intel(R) oneAPI"):
558+
warning("The MPI compiler `%s` doesn't use the Intel(R) oneAPI "
559+
"DPC++/C++ compiler underneath" % self.MPICC)
524560

525561
def __lookup_cmds__(self):
526-
# OneAPI Base Kit comes with dpcpp/icpx, both are clang++,
562+
# OneAPI HPC ToolKit comes with icpx, which is clang++,
527563
# and icx, which is clang
528564
self.CC = 'icx'
529565
self.CXX = 'icpx'
530-
self.MPICC = 'mpic++'
566+
self.MPICC = 'mpicc'
531567
self.MPICXX = 'mpicxx'
532568

533569

@@ -795,7 +831,8 @@ def __lookup_cmds__(self):
795831
'intel': IntelCompiler,
796832
'icpc': IntelCompiler,
797833
'icc': IntelCompiler,
798-
'icx': ICXCompiler,
834+
'icx': OneapiCompiler,
835+
'icpx': OneapiCompiler,
799836
'intel-knl': IntelKNLCompiler,
800837
'knl': IntelKNLCompiler,
801838
'dpcpp': DPCPPCompiler,

tests/conftest.py

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,8 @@
77
from devito import Eq, configuration # noqa
88
from devito.finite_differences.differentiable import EvalDerivative
99
from devito.arch import Cpu64, Device, sniff_mpi_distro, Arm
10-
from devito.arch.compiler import compiler_registry, IntelCompiler, NvidiaCompiler
10+
from devito.arch.compiler import (compiler_registry, IntelCompiler, OneapiCompiler,
11+
NvidiaCompiler)
1112
from devito.ir.iet import retrieve_iteration_tree, FindNodes, Iteration, ParallelBlock
1213
from devito.tools import as_tuple
1314

@@ -23,7 +24,8 @@ def skipif(items, whole_module=False):
2324
# Sanity check
2425
accepted = set()
2526
accepted.update({'device', 'device-C', 'device-openmp', 'device-openacc',
26-
'device-aomp', 'cpu64-icc', 'cpu64-nvc', 'cpu64-arm'})
27+
'device-aomp', 'cpu64-icc', 'cpu64-icpx', 'cpu64-nvc',
28+
'cpu64-arm'})
2729
accepted.update({'nompi', 'nodevice'})
2830
unknown = sorted(set(items) - accepted)
2931
if unknown:
@@ -69,6 +71,12 @@ def skipif(items, whole_module=False):
6971
isinstance(configuration['platform'], Cpu64):
7072
skipit = "`icc+cpu64` won't work with this test"
7173
break
74+
# Skip if it won't run with OneAPICompiler
75+
if i == 'cpu64-icpx' and \
76+
isinstance(configuration['compiler'], OneapiCompiler) and \
77+
isinstance(configuration['platform'], Cpu64):
78+
skipit = "`icpx+cpu64` won't work with this test"
79+
break
7280
# Skip if it won't run on Arm
7381
if i == 'cpu64-arm' and isinstance(configuration['platform'], Arm):
7482
skipit = "Arm doesn't support x86-specific instructions"

tests/test_dimension.py

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1336,6 +1336,8 @@ def test_affiness(self):
13361336
iterations = [i for i in FindNodes(Iteration).visit(op) if i.dim is not time]
13371337
assert all(i.is_Affine for i in iterations)
13381338

1339+
# Skipping this test with icpx, as it requires safe-math
1340+
@skipif('cpu64-icpx')
13391341
def test_sparse_time_function(self):
13401342
nt = 20
13411343

tests/test_dle.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -793,6 +793,7 @@ def test_incs_no_atomic(self):
793793
assert 'collapse(1)' in str(op1)
794794
assert 'atomic' not in str(op1)
795795

796+
@skipif('cpu64-icpx')
796797
@pytest.mark.parametrize('exprs,simd_level,expected', [
797798
(['Eq(y.symbolic_max, g[0, x], implicit_dims=(t, x))',
798799
'Inc(h1[0, 0], 1, implicit_dims=(t, x, y))'],

tests/test_dse.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -317,6 +317,7 @@ def test_time_dependent_split(opt):
317317

318318
class TestLifting(object):
319319

320+
@skipif('cpu64-icpx')
320321
@pytest.mark.parametrize('exprs,expected', [
321322
# none (different distance)
322323
(['Eq(y.symbolic_max, g[0, x], implicit_dims=(t, x))',

0 commit comments

Comments
 (0)