From b3ee4226ef24ac65c6b23ad3077bbdf58a2c7ff8 Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Mon, 25 Sep 2017 11:22:30 -0500 Subject: [PATCH 1/3] Use WriteOncePersistentDict instead of PersistentDict. --- pyopencl/invoker.py | 10 +++++++--- pyopencl/scan.py | 9 ++++++--- setup.py | 2 +- 3 files changed, 14 insertions(+), 7 deletions(-) diff --git a/pyopencl/invoker.py b/pyopencl/invoker.py index a11c6732..34566c6d 100644 --- a/pyopencl/invoker.py +++ b/pyopencl/invoker.py @@ -29,7 +29,7 @@ import numpy as np from warnings import warn from pyopencl._cffi import ffi as _ffi -from pytools.persistent_dict import PersistentDict +from pytools.persistent_dict import WriteOncePersistentDict, ReadOnlyEntryError from pyopencl.tools import _NumpyTypesKeyBuilder _PYPY = '__pypy__' in sys.builtin_module_names @@ -358,7 +358,8 @@ def _generate_enqueue_and_set_args_module(function_name, return gen.get_picklable_module(), enqueue_name -invoker_cache = PersistentDict("pyopencl-invoker-cache-v1", +invoker_cache = WriteOncePersistentDict( + "pyopencl-invoker-cache-v1", key_builder=_NumpyTypesKeyBuilder()) @@ -381,7 +382,10 @@ def generate_enqueue_and_set_args(function_name, if not from_cache: result = _generate_enqueue_and_set_args_module(*cache_key) - invoker_cache[cache_key] = result + try: + invoker_cache[cache_key] = result + except ReadOnlyEntryError: + pass pmod, enqueue_name = result diff --git a/pyopencl/scan.py b/pyopencl/scan.py index 169939ca..1fa25db1 100644 --- a/pyopencl/scan.py +++ b/pyopencl/scan.py @@ -40,7 +40,7 @@ from pyopencl.tools import (dtype_to_ctype, bitlog2, import pyopencl._mymako as mako from pyopencl._cluda import CLUDA_PREAMBLE -from pytools.persistent_dict import PersistentDict +from pytools.persistent_dict import WriteOncePersistentDict, ReadOnlyEntryError import logging @@ -1132,7 +1132,7 @@ class _GenericScanKernelBase(object): # }}} -generic_scan_kernel_cache = PersistentDict( +generic_scan_kernel_cache = WriteOncePersistentDict( "pyopencl-generated-scan-kernel-cache-v1", key_builder=_NumpyTypesKeyBuilder()) @@ -1187,7 +1187,10 @@ class GenericScanKernel(_GenericScanKernelBase): self.second_level_scan_gen_info, self.final_update_gen_info) - generic_scan_kernel_cache[cache_key] = result + try: + generic_scan_kernel_cache[cache_key] = result + except ReadOnlyEntryError: + pass # Build the kernels. self.first_level_scan_info = self.first_level_scan_gen_info.build( diff --git a/setup.py b/setup.py index d487cc1c..5705e945 100644 --- a/setup.py +++ b/setup.py @@ -225,7 +225,7 @@ def main(): install_requires=[ "numpy", - "pytools>=2017.2", + "pytools>=2017.5", "pytest>=2", "decorator>=3.2.0", "cffi>=1.1.0", -- GitLab From 38104745a23b784aa2a9d58e5c232d60ce4d8adc Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Mon, 25 Sep 2017 22:02:26 -0500 Subject: [PATCH 2/3] Use store_if_not_present(). --- pyopencl/invoker.py | 7 ++----- pyopencl/scan.py | 7 ++----- setup.py | 2 +- 3 files changed, 5 insertions(+), 11 deletions(-) diff --git a/pyopencl/invoker.py b/pyopencl/invoker.py index 34566c6d..8cad3f25 100644 --- a/pyopencl/invoker.py +++ b/pyopencl/invoker.py @@ -29,7 +29,7 @@ import numpy as np from warnings import warn from pyopencl._cffi import ffi as _ffi -from pytools.persistent_dict import WriteOncePersistentDict, ReadOnlyEntryError +from pytools.persistent_dict import WriteOncePersistentDict from pyopencl.tools import _NumpyTypesKeyBuilder _PYPY = '__pypy__' in sys.builtin_module_names @@ -382,10 +382,7 @@ def generate_enqueue_and_set_args(function_name, if not from_cache: result = _generate_enqueue_and_set_args_module(*cache_key) - try: - invoker_cache[cache_key] = result - except ReadOnlyEntryError: - pass + invoker_cache.store_if_not_present(cache_key, result) pmod, enqueue_name = result diff --git a/pyopencl/scan.py b/pyopencl/scan.py index 1fa25db1..f7be5683 100644 --- a/pyopencl/scan.py +++ b/pyopencl/scan.py @@ -40,7 +40,7 @@ from pyopencl.tools import (dtype_to_ctype, bitlog2, import pyopencl._mymako as mako from pyopencl._cluda import CLUDA_PREAMBLE -from pytools.persistent_dict import WriteOncePersistentDict, ReadOnlyEntryError +from pytools.persistent_dict import WriteOncePersistentDict import logging @@ -1187,10 +1187,7 @@ class GenericScanKernel(_GenericScanKernelBase): self.second_level_scan_gen_info, self.final_update_gen_info) - try: - generic_scan_kernel_cache[cache_key] = result - except ReadOnlyEntryError: - pass + generic_scan_kernel_cache.stored_if_not_present(cache_key, result) # Build the kernels. self.first_level_scan_info = self.first_level_scan_gen_info.build( diff --git a/setup.py b/setup.py index 5705e945..cc286e1f 100644 --- a/setup.py +++ b/setup.py @@ -225,7 +225,7 @@ def main(): install_requires=[ "numpy", - "pytools>=2017.5", + "pytools>=2017.6", "pytest>=2", "decorator>=3.2.0", "cffi>=1.1.0", -- GitLab From 4c6de1321a730a8bf0a01346fa28e77a006fbda2 Mon Sep 17 00:00:00 2001 From: Matt Wala Date: Mon, 25 Sep 2017 23:57:45 -0500 Subject: [PATCH 3/3] Fix typo. --- pyopencl/scan.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pyopencl/scan.py b/pyopencl/scan.py index f7be5683..d4226cf6 100644 --- a/pyopencl/scan.py +++ b/pyopencl/scan.py @@ -1187,7 +1187,7 @@ class GenericScanKernel(_GenericScanKernelBase): self.second_level_scan_gen_info, self.final_update_gen_info) - generic_scan_kernel_cache.stored_if_not_present(cache_key, result) + generic_scan_kernel_cache.store_if_not_present(cache_key, result) # Build the kernels. self.first_level_scan_info = self.first_level_scan_gen_info.build( -- GitLab