summaryrefslogtreecommitdiff
path: root/silx/opencl/projection.py
diff options
context:
space:
mode:
Diffstat (limited to 'silx/opencl/projection.py')
-rw-r--r--silx/opencl/projection.py89
1 files changed, 45 insertions, 44 deletions
diff --git a/silx/opencl/projection.py b/silx/opencl/projection.py
index 0ebe9bc..0505d80 100644
--- a/silx/opencl/projection.py
+++ b/silx/opencl/projection.py
@@ -29,7 +29,7 @@ from __future__ import absolute_import, print_function, with_statement, division
__authors__ = ["A. Mirone, P. Paleo"]
__license__ = "MIT"
-__date__ = "26/06/2017"
+__date__ = "28/02/2018"
import logging
import numpy as np
@@ -52,6 +52,7 @@ class Projection(OpenclProcessing):
OpenCL
"""
kernel_files = ["proj.cl", "array_utils.cl"]
+ logger.warning("Forward Projecter is untested and unsuported for now")
def __init__(self, slice_shape, angles, axis_position=None,
detector_width=None, normalize=False, ctx=None,
@@ -111,10 +112,10 @@ class Projection(OpenclProcessing):
endpoint=False).astype(dtype=np.float32)
else:
self.nprojs = len(self.angles)
- self.offset_x = -np.float32((self.shape[1]-1)/2. - self.axis_pos) # TODO: custom
- self.offset_y = -np.float32((self.shape[0]-1)/2. - self.axis_pos) # TODO: custom
+ self.offset_x = -np.float32((self.shape[1] - 1) / 2. - self.axis_pos) # TODO: custom
+ self.offset_y = -np.float32((self.shape[0] - 1) / 2. - self.axis_pos) # TODO: custom
# Reset axis_pos once offset are computed
- self.axis_pos0 = np.float((self.shape[1]-1)/2.)
+ self.axis_pos0 = np.float((self.shape[1] - 1) / 2.)
# Workgroup, ndrange and shared size
self.dimgrid_x = _idivup(self.dwidth, 16)
@@ -125,7 +126,7 @@ class Projection(OpenclProcessing):
self.wg = (16, 16)
self.ndrange = (
int(self.dimgrid_x) * self.wg[0], # int(): pyopencl <= 2015.1
- int(self.dimgrid_y) * self.wg[1] # int(): pyopencl <= 2015.1
+ int(self.dimgrid_y) * self.wg[1] # int(): pyopencl <= 2015.1
)
self.is_cpu = False
@@ -146,7 +147,7 @@ class Projection(OpenclProcessing):
self.nprojs, np.float32)
}
)
- self._tmp_extended_img = np.zeros((self.shape[0]+2, self.shape[1]+2),
+ self._tmp_extended_img = np.zeros((self.shape[0] + 2, self.shape[1] + 2),
dtype=np.float32)
if self.is_cpu:
self.allocate_slice()
@@ -158,41 +159,41 @@ class Projection(OpenclProcessing):
if self.is_cpu:
self.cl_mem["d_slice"].fill(0.)
# enqueue_fill_buffer has issues if opencl 1.2 is not present
- #~ pyopencl.enqueue_fill_buffer(
- #~ self.queue,
- #~ self.cl_mem["d_slice"],
- #~ np.float32(0),
- #~ 0,
- #~ self._tmp_extended_img.size * _sizeof(np.float32)
- #~ )
+ # ~ pyopencl.enqueue_fill_buffer(
+ # ~ self.queue,
+ # ~ self.cl_mem["d_slice"],
+ # ~ np.float32(0),
+ # ~ 0,
+ # ~ self._tmp_extended_img.size * _sizeof(np.float32)
+ # ~ )
# Precomputations
self.compute_angles()
self.proj_precomputations()
self.cl_mem["d_axis_corrections"].fill(0.)
# enqueue_fill_buffer has issues if opencl 1.2 is not present
- #~ pyopencl.enqueue_fill_buffer(
- #~ self.queue,
- #~ self.cl_mem["d_axis_corrections"],
- #~ np.float32(0),
- #~ 0,
- #~ self.nprojs*_sizeof(np.float32)
- #~ )
+ # ~ pyopencl.enqueue_fill_buffer(
+ # ~ self.queue,
+ # ~ self.cl_mem["d_axis_corrections"],
+ # ~ np.float32(0),
+ # ~ 0,
+ # ~ self.nprojs*_sizeof(np.float32)
+ # ~ )
# Shorthands
self._d_sino = self.cl_mem["_d_sino"]
OpenclProcessing.compile_kernels(self, self.kernel_files)
# check that workgroup can actually be (16, 16)
- self.check_workgroup_size("forward_kernel_cpu")
+ self.compiletime_workgroup_size = self.kernels.max_workgroup_size("forward_kernel_cpu")
def compute_angles(self):
- angles2 = np.zeros(self._dimrecy, dtype=np.float32) # dimrecy != num_projs
+ angles2 = np.zeros(self._dimrecy, dtype=np.float32) # dimrecy != num_projs
angles2[:self.nprojs] = np.copy(self.angles)
- angles2[self.nprojs:] = angles2[self.nprojs-1]
+ angles2[self.nprojs:] = angles2[self.nprojs - 1]
self.angles2 = angles2
pyopencl.enqueue_copy(self.queue, self.cl_mem["d_angles"], angles2)
def allocate_slice(self):
- self.add_to_cl_mem({"d_slice": parray.zeros(self.queue, (self.shape[1]+2, self.shape[1]+2), np.float32)})
+ self.add_to_cl_mem({"d_slice": parray.zeros(self.queue, (self.shape[1] + 2, self.shape[1] + 2), np.float32)})
def allocate_textures(self):
self.d_image_tex = pyopencl.Image(
@@ -211,13 +212,13 @@ class Projection(OpenclProcessing):
if self.is_cpu:
# TODO: create NoneEvent
return self.transfer_to_slice(image2)
- #~ return pyopencl.enqueue_copy(
- #~ self.queue,
- #~ self.cl_mem["d_slice"].data,
- #~ image2,
- #~ origin=(1, 1),
- #~ region=image.shape[::-1]
- #~ )
+ # ~ return pyopencl.enqueue_copy(
+ # ~ self.queue,
+ # ~ self.cl_mem["d_slice"].data,
+ # ~ image2,
+ # ~ origin=(1, 1),
+ # ~ region=image.shape[::-1]
+ # ~ )
else:
return pyopencl.enqueue_copy(
self.queue,
@@ -238,11 +239,11 @@ class Projection(OpenclProcessing):
d_image,
offset=0,
origin=(1, 1),
- region=(int(self.shape[1]), int(self.shape[0]))#self.shape[::-1] # pyopencl <= 2015.2
+ region=(int(self.shape[1]), int(self.shape[0])) # self.shape[::-1] # pyopencl <= 2015.2
)
def transfer_to_slice(self, image):
- image2 = np.zeros((image.shape[0]+2, image.shape[1]+2), dtype=np.float32)
+ image2 = np.zeros((image.shape[0] + 2, image.shape[1] + 2), dtype=np.float32)
image2[1:-1, 1:-1] = image.astype(np.float32)
self.cl_mem["d_slice"].set(image2)
@@ -272,14 +273,14 @@ class Projection(OpenclProcessing):
strideLine[0][case1] = 0
strideLine[1][case1] = 1
- beginPos[0][case2] = dimslice-1
- beginPos[1][case2] = dimslice-1
+ beginPos[0][case2] = dimslice - 1
+ beginPos[1][case2] = dimslice - 1
strideJoseph[0][case2] = -1
strideJoseph[1][case2] = 0
strideLine[0][case2] = 0
strideLine[1][case2] = -1
- beginPos[0][case3] = dimslice-1
+ beginPos[0][case3] = dimslice - 1
beginPos[1][case3] = 0
strideJoseph[0][case3] = 0
strideJoseph[1][case3] = 1
@@ -287,16 +288,16 @@ class Projection(OpenclProcessing):
strideLine[1][case3] = 0
beginPos[0][case4] = 0
- beginPos[1][case4] = dimslice-1
+ beginPos[1][case4] = dimslice - 1
strideJoseph[0][case4] = 0
strideJoseph[1][case4] = -1
strideLine[0][case4] = 1
strideLine[1][case4] = 0
# For debug purpose
- #~ self.beginPos = beginPos
- #~ self.strideJoseph = strideJoseph
- #~ self.strideLine = strideLine
+ # ~ self.beginPos = beginPos
+ # ~ self.strideJoseph = strideJoseph
+ # ~ self.strideLine = strideLine
#
pyopencl.enqueue_copy(self.queue, self.cl_mem["d_beginPos"], beginPos)
@@ -307,7 +308,7 @@ class Projection(OpenclProcessing):
return pyopencl.LocalMemory(self.local_mem) # constant for all image sizes
def cpy2d_to_sino(self, dst):
- ndrange = (int(self.dwidth), int(self.nprojs)) # pyopencl < 2015.2
+ ndrange = (int(self.dwidth), int(self.nprojs)) # pyopencl < 2015.2
sino_shape_ocl = np.int32(ndrange)
wg = None
kernel_args = (
@@ -325,13 +326,13 @@ class Projection(OpenclProcessing):
"""
copy a Nx * Ny slice to self.d_slice which is (Nx+2)*(Ny+2)
"""
- ndrange = (int(self.shape[1]), int(self.shape[0])) #self.shape[::-1] # pyopencl < 2015.2
+ ndrange = (int(self.shape[1]), int(self.shape[0])) # self.shape[::-1] # pyopencl < 2015.2
wg = None
slice_shape_ocl = np.int32(ndrange)
kernel_args = (
self.cl_mem["d_slice"].data,
src,
- np.int32(self.shape[1]+2),
+ np.int32(self.shape[1] + 2),
np.int32(self.shape[1]),
np.int32((1, 1)),
np.int32((0, 0)),
@@ -413,7 +414,7 @@ class Projection(OpenclProcessing):
# /with self.sem
if self.profile:
self.events += events
- #~ res = self._ex_sino
+ # ~ res = self._ex_sino
return res
__call__ = projection