137
137
MemoryObject ,
138
138
MemoryMap ,
139
139
Buffer ,
140
+ PooledBuffer ,
140
141
141
142
_Program ,
142
143
Kernel ,
197
198
enqueue_migrate_mem_objects , unload_platform_compiler )
198
199
199
200
if get_cl_header_version () >= (2 , 0 ):
200
- from pyopencl ._cl import SVM , SVMAllocation , SVMPointer
201
+ from pyopencl ._cl import SVM , SVMAllocation , SVMPointer , PooledSVM
201
202
202
203
if _cl .have_gl ():
203
204
from pyopencl ._cl import ( # noqa: F401
@@ -2439,21 +2440,28 @@ def queue_for_pickling(queue, alloc=None):
2439
2440
_QUEUE_FOR_PICKLING_TLS .alloc = None
2440
2441
2441
2442
2442
- def _getstate_buffer (self ):
2443
- import pyopencl as cl
2444
- state = {}
2445
- state ["size" ] = self .size
2446
- state ["flags" ] = self .flags
2447
-
2443
+ def _get_queue_for_pickling (obj ):
2448
2444
try :
2449
2445
queue = _QUEUE_FOR_PICKLING_TLS .queue
2446
+ alloc = _QUEUE_FOR_PICKLING_TLS .alloc
2450
2447
except AttributeError :
2451
2448
queue = None
2452
2449
2453
2450
if queue is None :
2454
- raise RuntimeError ("CL Buffer instances can only be pickled while "
2451
+ raise RuntimeError (f" { type ( obj ). __name__ } instances can only be pickled while "
2455
2452
"queue_for_pickling is active." )
2456
2453
2454
+ return queue , alloc
2455
+
2456
+
2457
+ def _getstate_buffer (self ):
2458
+ import pyopencl as cl
2459
+ queue , _alloc = _get_queue_for_pickling (self )
2460
+
2461
+ state = {}
2462
+ state ["size" ] = self .size
2463
+ state ["flags" ] = self .flags
2464
+
2457
2465
a = bytearray (self .size )
2458
2466
cl .enqueue_copy (queue , a , self )
2459
2467
@@ -2463,42 +2471,57 @@ def _getstate_buffer(self):
2463
2471
2464
2472
2465
2473
def _setstate_buffer (self , state ):
2466
- try :
2467
- queue = _QUEUE_FOR_PICKLING_TLS .queue
2468
- except AttributeError :
2469
- queue = None
2470
-
2471
- if queue is None :
2472
- raise RuntimeError ("CL Buffer instances can only be unpickled while "
2473
- "queue_for_pickling is active." )
2474
+ import pyopencl as cl
2475
+ queue , _alloc = _get_queue_for_pickling (self )
2474
2476
2475
2477
size = state ["size" ]
2476
2478
flags = state ["flags" ]
2477
2479
2478
- import pyopencl as cl
2479
-
2480
2480
a = state ["_pickle_data" ]
2481
2481
Buffer .__init__ (self , queue .context , flags | cl .mem_flags .COPY_HOST_PTR , size , a )
2482
2482
2483
2483
2484
2484
Buffer .__getstate__ = _getstate_buffer
2485
2485
Buffer .__setstate__ = _setstate_buffer
2486
2486
2487
+
2488
+ def _getstate_pooledbuffer (self ):
2489
+ import pyopencl as cl
2490
+ queue , _alloc = _get_queue_for_pickling (self )
2491
+
2492
+ state = {}
2493
+ state ["size" ] = self .size
2494
+ state ["flags" ] = self .flags
2495
+
2496
+ a = bytearray (self .size )
2497
+ cl .enqueue_copy (queue , a , self )
2498
+ state ["_pickle_data" ] = a
2499
+
2500
+ return state
2501
+
2502
+
2503
+ def _setstate_pooledbuffer (self , state ):
2504
+ _queue , _alloc = _get_queue_for_pickling (self )
2505
+
2506
+ _size = state ["size" ]
2507
+ _flags = state ["flags" ]
2508
+
2509
+ _a = state ["_pickle_data" ]
2510
+ # FIXME: Unclear what to do here - PooledBuffer does not have __init__
2511
+
2512
+
2513
+ PooledBuffer .__getstate__ = _getstate_pooledbuffer
2514
+ PooledBuffer .__setstate__ = _setstate_pooledbuffer
2515
+
2516
+
2487
2517
if get_cl_header_version () >= (2 , 0 ):
2488
- def _getstate_svm (self ):
2518
+ def _getstate_svmallocation (self ):
2489
2519
import pyopencl as cl
2490
2520
2491
2521
state = {}
2492
2522
state ["size" ] = self .size
2493
2523
2494
- try :
2495
- queue = _QUEUE_FOR_PICKLING_TLS .queue
2496
- except AttributeError :
2497
- queue = None
2498
-
2499
- if queue is None :
2500
- raise RuntimeError (f"{ self .__class__ .__name__ } instances can only be "
2501
- "pickled while queue_for_pickling is active." )
2524
+ queue , _alloc = _get_queue_for_pickling (self )
2502
2525
2503
2526
a = bytearray (self .size )
2504
2527
cl .enqueue_copy (queue , a , self )
@@ -2507,17 +2530,10 @@ def _getstate_svm(self):
2507
2530
2508
2531
return state
2509
2532
2510
- def _setstate_svm (self , state ):
2533
+ def _setstate_svmallocation (self , state ):
2511
2534
import pyopencl as cl
2512
2535
2513
- try :
2514
- queue = _QUEUE_FOR_PICKLING_TLS .queue
2515
- except AttributeError :
2516
- queue = None
2517
-
2518
- if queue is None :
2519
- raise RuntimeError (f"{ self .__class__ .__name__ } instances can only be "
2520
- "unpickled while queue_for_pickling is active." )
2536
+ queue , _alloc = _get_queue_for_pickling (self )
2521
2537
2522
2538
size = state ["size" ]
2523
2539
@@ -2526,8 +2542,33 @@ def _setstate_svm(self, state):
2526
2542
queue = queue )
2527
2543
cl .enqueue_copy (queue , self , a )
2528
2544
2529
- SVMAllocation .__getstate__ = _getstate_svm
2530
- SVMAllocation .__setstate__ = _setstate_svm
2545
+ SVMAllocation .__getstate__ = _getstate_svmallocation
2546
+ SVMAllocation .__setstate__ = _setstate_svmallocation
2547
+
2548
+ def _getstate_pooled_svm (self ):
2549
+ import pyopencl as cl
2550
+
2551
+ state = {}
2552
+ state ["size" ] = self .size
2553
+
2554
+ queue , _alloc = _get_queue_for_pickling (self )
2555
+
2556
+ a = bytearray (self .size )
2557
+ cl .enqueue_copy (queue , a , self )
2558
+
2559
+ state ["_pickle_data" ] = a
2560
+
2561
+ return state
2562
+
2563
+ def _setstate_pooled_svm (self , state ):
2564
+ _queue , _alloc = _get_queue_for_pickling (self )
2565
+ _size = state ["size" ]
2566
+ _data = state ["_pickle_data" ]
2567
+
2568
+ # FIXME: Unclear what to do here - PooledSVM does not have __init__
2569
+
2570
+ PooledSVM .__getstate__ = _getstate_pooled_svm
2571
+ PooledSVM .__setstate__ = _setstate_pooled_svm
2531
2572
2532
2573
# }}}
2533
2574
0 commit comments