Source code for nabu.reconstruction.sinogram_opencl

import numpy as np
from ..opencl.kernel import OpenCLKernel
from ..opencl.processing import OpenCLProcessing
from ..utils import get_opencl_srcfile
from .sinogram import SinoMult


[docs] class OpenCLSinoMult(SinoMult): def __init__(self, sino_shape, rot_center, **opencl_options): super().__init__(sino_shape, rot_center) self.opencl_processing = OpenCLProcessing(**opencl_options) self._init_kernel() def _init_kernel(self): self.halftomo_kernel = OpenCLKernel( "halftomo_prepare_sinogram", self.opencl_processing.ctx, filename=get_opencl_srcfile("halftomo.cl"), ) self.d_weights = self.opencl_processing.set_array("d_weights", self.weights) self._halftomo_kernel_other_args = [ self.d_weights, np.int32(self.n_a), np.int32(self.n_x), np.int32(self.start_x), np.int32(self.end_x), ] self._global_size = (self.n_x, self.n_a) self._local_size = None # (32, 32, 1) # tune ?
[docs] def prepare_sino(self, sino): sino = self.opencl_processing.set_array("d_sino", sino) ev = self.halftomo_kernel( self.opencl_processing.queue, sino, *self._halftomo_kernel_other_args, global_size=self._global_size, local_size=self._local_size, ) if self.opencl_processing.device_type == "cpu": ev.wait() return sino