#python #ubuntu #opencl #archlinux #pyopencl
#питон #ubuntu #opencl #archlinux #пиопенкл
Вопрос:
может ли кто-нибудь объяснить мне, почему следующий код ядра OpenCL (предположим, что z_new-это какой-то float8):
float fac = 0.0f; float8 square = 0.0f; square = powr(z_new[i], 2); fac = sqrt(square.s0 square.s1 square.s2 square.s3 square.s4 square.s5);
приводит к этой ошибке сегментации:
Fatal Python error: Bus error Current thread 0x00007fc40ccd1740 (most recent call first): File "/usr/local/lib/python3.8/dist-packages/pyopencl/cache.py", line 400 in _create_built_program_from_source_cached File "/usr/local/lib/python3.8/dist-packages/pyopencl/cache.py", line 473 in create_built_program_from_source_cached File "/usr/local/lib/python3.8/dist-packages/pyopencl/__init__.py", line 537 in lt;lambdagt; File "/usr/local/lib/python3.8/dist-packages/pyopencl/__init__.py", line 557 in _build_and_catch_errors File "/usr/local/lib/python3.8/dist-packages/pyopencl/__init__.py", line 536 in build File "/opt/pyqmri/pyqmri/_helper_fun/_clprogram.py", line 20 in __init__ File "/opt/pyqmri/test/unittests/test_LinearDataOperator_CPU.py", line 582 in setUp File "lt;stdingt;", line 1 in lt;modulegt; Bus error (core dumped)
если добавлена последняя строка.
Следующее работает просто отлично и достигает того же результата, но я просто озадачен, почему это произошло:
fac = hypot(fac, hypot( hypot( z_new[i].s0, z_new[i].s1 ), hypot( hypot( z_new[i].s2, z_new[i].s3 ), hypot( z_new[i].s4, z_new[i].s5 ) ) ) );
Это происходит только при использовании одинарной точности (двойная точность работает без segfault).
Код был скомпилирован с использованием pocl версии 1.1 с Python 3.8 и PyOpenCL 2021.2.9 на Ubuntu 18.04.5 LTS.
Код отлично работает в последней версии Arch Linux с использованием тех же пакетов, что и выше.
Спасибо!