arrayfire / arrayfire-python

Python bindings for ArrayFire: A general purpose GPU library.
https://arrayfire.com
BSD 3-Clause "New" or "Revised" License
416 stars 65 forks source link

Backend choice reset inside of threads #257

Open hexane360 opened 3 years ago

hexane360 commented 3 years ago

Inside a new thread, Arrayfire uses the default backend rather than the backend set by the parent thread:

>>> import arrayfire as af
>>> af.get_available_backends()
('cpu', 'cuda', 'opencl')
>>> af.get_active_backend()
'cuda'
>>> af.set_backend('opencl')
>>> af.get_active_backend()
'opencl'
>>> from threading import Thread
>>> Thread(target=lambda: print(af.get_active_backend())).start()
cuda

Is this expected behavior and/or documented anywhere? I would think that the active backend should be process local rather than thread local.

If it matters, here's my version info: OS: Ubuntu 20.04 arrayfire: 3.9.0 (commit 955152b6) arrayfire-python: 3.8.10

cuda: 11.4.0-1 ocl-icd-libopencl1: 2.2.11-1 intel-mkl: 2020.0.166-1

9prady9 commented 3 years ago

@hexane360 set_device, set_backend these are all per thread states, they are not inherited automatically. So I would say, it is not reset, but rather it is left to default value in another thread, hence you are not seeing the values you are setting on main thread.

@umar456 @syurkevi Can you please redirect me to the location in our docs regarding threads in ArrayFire if we have it - I can't recollect it unfortunately.