3D rotation on PyCuda

classic Classic list List threaded Threaded
2 messages Options
Reply | Threaded
Open this post in threaded view
|

3D rotation on PyCuda

ghum
Hi,

I am trying to extend the sample code for 2D rotation from https://wiki.tiker.net/PyCuda/Examples/Rotate to 3D. Equation #2 on http://mathworld.wolfram.com/RotationMatrix.html represents the sample implementation, I implemented equations #3, #4 and #5 to make it work with 3D data. Here is summary what I tried so far:
- Set 'texture<float, 3> tex;'
- I am not sure about the offset, I put it as 'int didx = z*newih*newid + y * newiw + x;'
- Changed all text2D for text3D
- The original code uses: 'cuda.matrix_to_texref(a, texref, order="C")' to generate the 2D cuda texture, but as I want to work with 3D data, this method does not work. I checked that matrix_to_texref calls the function matrix_to_array that is explicitly implemented for 2D as you can see here: 'h, w = matrix.shape'. I tried to adapt the code to 3D:

def matrix3D_to_texref(matrix, texref, order):
    bind_array_to_texref(matrix3D_to_array(matrix, order), texref)
   
def matrix3D_to_array(matrix, order, allow_double_hack=False):
    if order.upper() == "C":
        d, h, w = matrix.shape#TODO: I am not sure about this, it was previously without 'd', now it should work with 3D data
        stride = 0
    elif order.upper() == "F":
        d, w, h = matrix.shape
        stride = -1
    else:
        raise LogicError("order must be either F or C")

    matrix = np.asarray(matrix, order=order)
    descr = ArrayDescriptor3D()#TODO: I am not sure about this, it was previously ArrayDescriptor()

    descr.width = w
    descr.height = h
    descr.depth = d #TODO: I am not sure about this, this was not there previously

    if matrix.dtype == np.float64 and allow_double_hack:
        descr.format = array_format.SIGNED_INT32
        descr.num_channels = 3
    else:
        descr.format = dtype_to_array_format(matrix.dtype)
        descr.num_channels = 1

    ary = Array(descr)

    copy = Memcpy3D() #TODO: I am not sure about this, originally it was Memcpy2D()
    copy.set_src_host(matrix)
    copy.set_dst_array(ary)
    copy.width_in_bytes = copy.src_pitch = copy.dst_pitch = \
            matrix.strides[stride]
    copy.height = h
    copy.depth = d #TODO: I am not sure about this, this was not there previously
    copy(aligned=True)

    return ary

Is there another way to generate a 3D pycuda texture? Or maybe I am close to fix the issue, for now I am getting the following error:

Boost.Python.ArgumentError: Python argument types in
    Memcpy3D.__call__(Memcpy3D)
did not match C++ signature:
    __call__(struct pycuda::memcpy_3d {lvalue}, class pycuda::stream)
    __call__(struct pycuda::memcpy_3d {lvalue})


Best regards,
Gabriel
Reply | Threaded
Open this post in threaded view
|

Re: 3D rotation on PyCuda

Andreas Kloeckner
ghum <[hidden email]> writes:

>     copy(aligned=True)
>
>     return ary
>
> Is there another way to generate a 3D pycuda texture? Or maybe I am close to
> fix the issue, for now I am getting the following error:
>
> Boost.Python.ArgumentError: Python argument types in
>     Memcpy3D.__call__(Memcpy3D)
> did not match C++ signature:
>     __call__(struct pycuda::memcpy_3d {lvalue}, class pycuda::stream)
>     __call__(struct pycuda::memcpy_3d {lvalue})

I think your main issue might be that Memcpy3D doesn't support the
'aligned' kwarg.

Andreas

_______________________________________________
PyCUDA mailing list
[hidden email]
https://lists.tiker.net/listinfo/pycuda