Source code for nabu.processing.fft_opencl
from multiprocessing import get_context
from multiprocessing.pool import Pool
from .fft_base import _BaseVKFFT
from ..opencl.processing import OpenCLProcessing
try:
from pyvkfft.opencl import VkFFTApp as vk_clfft
__has_vkfft__ = True
except (ImportError, OSError):
__has_vkfft__ = False
vk_clfft = None
[docs]
class VKCLFFT(_BaseVKFFT):
"""
OpenCL FFT, using VKFFT backend
"""
implem = "vkfft"
backend = "opencl"
ProcessingCls = OpenCLProcessing
vkffs_cls = vk_clfft
def _init_backend(self, backend_options):
super()._init_backend(backend_options)
self._vkfft_other_init_kwargs = {"queue": self.processing.queue}
def _has_vkfft(x):
# should be run from within a Process
try:
from nabu.processing.fft_opencl import VKCLFFT, __has_vkfft__
if not __has_vkfft__:
return False
vk = VKCLFFT((16,), "f")
avail = True
except (RuntimeError, OSError):
avail = False
return avail
[docs]
def has_vkfft(safe=True):
"""
Determine whether pyvkfft is available.
This function cannot be tested from a notebook/console, a proper entry point has to be created (if __name__ == "__main__").
"""
if not safe:
return _has_vkfft(None)
ctx = get_context("spawn")
with Pool(1, context=ctx) as p:
v = p.map(_has_vkfft, [1])[0]
return v