From 3ee119891db98deef0651856bb073e7eb0dbd49d Mon Sep 17 00:00:00 2001 From: Hao Gao Date: Sun, 24 Jun 2018 16:51:31 +0800 Subject: [PATCH 1/2] Add a method for transferring arrays in DeviceDataRecord from host to device --- boxtree/tools.py | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/boxtree/tools.py b/boxtree/tools.py index 68ac5f4..49cfa8b 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) + else: + return attr + + return self._transform_arrays(_to_device) + # }}} -- GitLab From 1927bcff207660b07e0090e28422f59b266058c5 Mon Sep 17 00:00:00 2001 From: Hao Gao Date: Mon, 25 Jun 2018 08:04:00 +0800 Subject: [PATCH 2/2] Add test case --- boxtree/tools.py | 2 +- test/test_tools.py | 66 ++++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 67 insertions(+), 1 deletion(-) create mode 100644 test/test_tools.py diff --git a/boxtree/tools.py b/boxtree/tools.py index 49cfa8b..ec8af1b 100644 --- a/boxtree/tools.py +++ b/boxtree/tools.py @@ -331,7 +331,7 @@ class DeviceDataRecord(Record): def _to_device(attr): if isinstance(attr, np.ndarray): - return cl.array.to_device(queue, attr) + return cl.array.to_device(queue, attr).with_queue(None) else: return attr diff --git a/test/test_tools.py b/test/test_tools.py new file mode 100644 index 0000000..0a2f23e --- /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 -- GitLab