Source code for pyfr.backends.openmp.base

# -*- coding: utf-8 -*-

import numpy as np

from pyfr.backends.base import BaseBackend


[docs]class OpenMPBackend(BaseBackend): name = 'openmp' blocks = True def __init__(self, cfg): super().__init__(cfg) # Take the default alignment requirement to be 64-bytes self.alignb = cfg.getint('backend-openmp', 'alignb', 64) if self.alignb < 32 or (self.alignb & (self.alignb - 1)): raise ValueError('Alignment must be a power of 2 and >= 32') # Compute the SoA and AoSoA size self.soasz = self.alignb // np.dtype(self.fpdtype).itemsize self.csubsz = self.soasz*cfg.getint('backend-openmp', 'n-soa', 1) from pyfr.backends.openmp import (blasext, gimmik, packing, provider, types, xsmm) # Register our data types self.base_matrix_cls = types.OpenMPMatrixBase self.const_matrix_cls = types.OpenMPConstMatrix self.matrix_cls = types.OpenMPMatrix self.matrix_bank_cls = types.OpenMPMatrixBank self.matrix_slice_cls = types.OpenMPMatrixSlice self.queue_cls = types.OpenMPQueue self.view_cls = types.OpenMPView self.xchg_matrix_cls = types.OpenMPXchgMatrix self.xchg_view_cls = types.OpenMPXchgView # Instantiate mandatory kernel provider classes kprovcls = [provider.OpenMPPointwiseKernelProvider, blasext.OpenMPBlasExtKernels, packing.OpenMPPackingKernels] self._providers = [k(self) for k in kprovcls] # Instantiate optional kernel provider classes try: self._providers.append(xsmm.OpenMPXSMMKernels(self)) except OSError: pass self._providers.append(gimmik.OpenMPGiMMiKKernels(self)) # Pointwise kernels self.pointwise = self._providers[0]
[docs] def _malloc_impl(self, nbytes): data = np.zeros(nbytes + self.alignb, dtype=np.uint8) offset = -data.ctypes.data % self.alignb return data[offset:nbytes + offset]