Source code for pyfr.backends.mic.base

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

import numpy as np

from pyfr.backends.base import BaseBackend
from pyfr.mpiutil import get_local_rank
from pyfr.template import DottedTemplateLookup


[docs]class MICBackend(BaseBackend): name = 'mic' def __init__(self, cfg): super().__init__(cfg) import pymic as mic # Get the device ID to use devid = cfg.get('backend-mic', 'device-id', 'local-rank') # Handle the local-rank case if devid == 'local-rank': devid = str(get_local_rank()) # Get a handle to the desired device self.dev = mic.devices[int(devid)] # Default stream self.sdflt = self.dev.get_default_stream() # Take the alignment requirement to be 64-bytes self.alignb = 64 from pyfr.backends.mic import (blasext, cblas, packing, provider, types) # Register our data types self.base_matrix_cls = types.MICMatrixBase self.const_matrix_cls = types.MICConstMatrix self.matrix_cls = types.MICMatrix self.matrix_bank_cls = types.MICMatrixBank self.matrix_rslice_cls = types.MICMatrixRSlice self.queue_cls = types.MICQueue self.view_cls = types.MICView self.xchg_matrix_cls = types.MICXchgMatrix self.xchg_view_cls = types.MICXchgView # Template lookup self.lookup = DottedTemplateLookup( 'pyfr.backends.mic.kernels', fpdtype=self.fpdtype, alignb=self.alignb ) # Kernel provider classes kprovcls = [provider.MICPointwiseKernelProvider, blasext.MICBlasExtKernels, packing.MICPackingKernels, cblas.MICCBLASKernels] self._providers = [k(self) for k in kprovcls] # Pointwise kernels self.pointwise = self._providers[0]
[docs] def _malloc_impl(self, nbytes): stream = self.sdflt # Allocate an empty buffer on the device buf = stream.allocate_device_memory(nbytes) # Attach the raw device pointer buf.dev_ptr = stream.translate_device_pointer(buf) # Zero the buffer zeros = np.zeros(nbytes, dtype=np.uint8) stream.transfer_host2device(zeros.ctypes.data, buf, nbytes) stream.sync() return buf