diff --git a/boxtree/tools.py b/boxtree/tools.py index 68ac5f430d8d9681a8e58208da17c88ffe6b4fe5..ec8af1b285720df993ea3ccb993ca775288c738b 100644 --- a/boxtree/tools.py +++ b/boxtree/tools.py @@ -324,6 +324,19 @@ class DeviceDataRecord(Record): return self._transform_arrays(try_with_queue) + def to_device(self, queue): + """ Return a copy of `self` in all :class:`numpy.ndarray` arrays are + transferred to device memory as :class:`pyopencl.array.Array` objects. + """ + + def _to_device(attr): + if isinstance(attr, np.ndarray): + return cl.array.to_device(queue, attr).with_queue(None) + else: + return attr + + return self._transform_arrays(_to_device) + # }}} diff --git a/test/test_tools.py b/test/test_tools.py new file mode 100644 index 0000000000000000000000000000000000000000..0a2f23e9a77b82c0c3e37c40117f1e71bf140152 --- /dev/null +++ b/test/test_tools.py @@ -0,0 +1,66 @@ +from __future__ import division, absolute_import, print_function +import numpy as np +import pyopencl as cl + +__copyright__ = "Copyright (C) 2012 Andreas Kloeckner \ + Copyright (C) 2018 Hao Gao" + +__license__ = """ +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. +""" + + +def test_device_record(): + from boxtree.tools import DeviceDataRecord + + array = np.arange(60).reshape((3, 4, 5)) + + obj_array = np.empty((3,), dtype=object) + for i in range(3): + obj_array[i] = np.arange((i + 1) * 40).reshape(5, i + 1, 8) + + record = DeviceDataRecord( + array=array, + obj_array=obj_array + ) + + ctx = cl.create_some_context() + + with cl.CommandQueue(ctx) as queue: + record_dev = record.to_device(queue) + record_host = record_dev.get(queue) + + assert np.array_equal(record_host.array, record.array) + + for i in range(3): + assert np.array_equal(record_host.obj_array[i], record.obj_array[i]) + + +# You can test individual routines by typing +# $ python test_tools.py 'test_routine' + +if __name__ == "__main__": + import sys + if len(sys.argv) > 1: + exec(sys.argv[1]) + else: + from pytest import main + main([__file__]) + +# vim: fdm=marker