LINUX.ORG.RU

Python OpenCL: не работает даже самый простой пример

 ,


0

3

Привет

Запускаю пример вот отсюда: https://github.com/inducer/pyopencl/blob/main/examples/demo.py

#!/usr/bin/env python

import numpy as np

import pyopencl as cl


rng = np.random.default_rng()
a_np = rng.random(50000, dtype=np.float32)
b_np = rng.random(50000, dtype=np.float32)

ctx = cl.create_some_context()
queue = cl.CommandQueue(ctx)

mf = cl.mem_flags
a_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=a_np)
b_g = cl.Buffer(ctx, mf.READ_ONLY | mf.COPY_HOST_PTR, hostbuf=b_np)

prg = cl.Program(ctx, """
__kernel void sum(
    __global const float *a_g, __global const float *b_g, __global float *res_g)
{
  int gid = get_global_id(0);
  res_g[gid] = a_g[gid] + b_g[gid];
}
""").build()

res_g = cl.Buffer(ctx, mf.WRITE_ONLY, a_np.nbytes)
knl = prg.sum  # Use this Kernel object for repeated calls
knl(queue, a_np.shape, None, a_g, b_g, res_g)

res_np = np.empty_like(a_np)
cl.enqueue_copy(queue, res_np, res_g)

# Check on CPU with Numpy:
error_np = res_np - (a_np + b_np)
print(f"Error:\n{error_np}")
print(f"Norm: {np.linalg.norm(error_np):.16e}")
assert np.allclose(res_np, a_np + b_np)

Получаю ошибку:

/usr/lib/python3.12/site-packages/pyopencl/cache.py:495: CompilerWarning: Non-empty compiler output encountered. Set the environment variable PYOPENCL_COMPILER_OUTPUT=1 to see more.
  _create_built_program_from_source_cached(
Traceback (most recent call last):
  File "/home/kroz/mine/prj/prg/python/hsa/test_2.py", line 29, in <module>
    knl = prg.sum  # Use this Kernel object for repeated calls
          ^^^^^^^
  File "/usr/lib/python3.12/site-packages/pyopencl/__init__.py", line 443, in __getattr__
    knl = Kernel(self, attr)
          ^^^^^^^^^^^^^^^^^^
TypeError: __init__(): incompatible function arguments. The following argument types are supported:
    1. __init__(self, arg0: pyopencl._cl._Program, arg1: str, /) -> None

Invoked with types: pyopencl._cl.Kernel, pyopencl.Program, str

Что я делаю не так?

★★★★★
Ответ на: комментарий от anonymous

Так?

P. S. Кстати, ffmpeg, не смотря на то, что он показывает наличие OpenCL, так и не смог использовать ни одного фильтра с OpenCL. Но это будет тема моего следующего топика :)

$ ffmpeg -hwaccels
...
Hardware acceleration methods:
cuda
opencl
vulkan

$ ls -1 /etc/OpenCL/vendors/*.icd
/etc/OpenCL/vendors/amdocl64.icd
/etc/OpenCL/vendors/nvidia.icd

$ cat opencl_test.py
import pyopencl

# Show devices
platforms = pyopencl.get_platforms()
for platform in platforms:
    for device in platform.get_devices():
        print(f"Platform: {platform.name}, Device: {device.name}")

$ python3 opencl_test.py
Platform: AMD Accelerated Parallel Processing, Device: gfx90c:xnack-
Platform: NVIDIA CUDA, Device: NVIDIA GeForce RTX 3050 Ti Laptop GPU

$ clinfo
Number of platforms                               2
  Platform Name                                   AMD Accelerated Parallel Processing
  Platform Vendor                                 Advanced Micro Devices, Inc.
  Platform Version                                OpenCL 2.1 AMD-APP.dbg (3614.0)
  Platform Profile                                FULL_PROFILE
...
  Platform Name                                   NVIDIA CUDA
  Platform Vendor                                 NVIDIA Corporation
  Platform Version                                OpenCL 3.0 CUDA 12.4.131
  Platform Profile                                FULL_PROFILE
...
  Platform Name                                   AMD Accelerated Parallel Processing
Number of devices                                 1
  Device Name                                     gfx90c:xnack-
  Device Version                                  OpenCL 2.0
  Driver Version                                  3614.0 (HSA1.1,LC)
  Device Type                                     GPU
  Device Board Name (AMD)                         AMD Radeon Graphics
  Device Profile                                  FULL_PROFILE
  Device Available                                Yes
  Compiler Available                              Yes
  Linker Available                                Yes
  Max compute units                               7
  Max clock frequency                             1800MHz
...
  Platform Name                                   NVIDIA CUDA
Number of devices                                 1
  Device Name                                     NVIDIA GeForce RTX 3050 Ti Laptop GPU
  Device Version                                  OpenCL 3.0 CUDA
  Driver Version                                  550.135
  Device Type                                     GPU
  Device Profile                                  FULL_PROFILE
  Device Available                                Yes
  Compiler Available                              Yes
  Linker Available                                Yes
  Max compute units                               20
  Max clock frequency                             1485MHz
  Compute Capability (NV)                         8.6
  Global memory size                              4084400128 (3.804GiB)
  Max memory allocation                           1021100032 (973.8MiB)

Kroz ★★★★★
() автор топика
Последнее исправление: Kroz (всего исправлений: 1)
Ответ на: комментарий от cobold

CompilerWarning: Non-empty compiler output encountered. Set the environment variable PYOPENCL_COMPILER_OUTPUT=1 to see more.

И что там компилятор пишет?

Этот ворнинг не есть проблема, он легко убирается. Но если интересно, внизу выхлоп с PYOPENCL_COMPILER_OUTPUT=1

Проблема вот в этом:

__init__(self, arg0: pyopencl._cl._Program, arg1: str, /) -> None

Что такое слеш перед закрывающейся скобкой? Ну и почему оно не работает?

/usr/lib/python3.12/site-packages/pyopencl/cache.py:495: CompilerWarning: Built kernel retrieved from cache. Original from-source build had warnings:
Build on <pyopencl.Device 'gfx90c:xnack-' on 'AMD Accelerated Parallel Processing' at 0x562a6d871690> succeeded, but said:

warning: argument unused during compilation: '-I /usr/lib/python3.12/site-packages/pyopencl/cl' [-Wunused-command-line-argument]
1 warning generated.

  _create_built_program_from_source_cached(
Traceback (most recent call last):
  File "/home/kroz/mine/prj/prg/python/hsa/test_2.py", line 29, in <module>
    knl = prg.sum  # Use this Kernel object for repeated calls
          ^^^^^^^
  File "/usr/lib/python3.12/site-packages/pyopencl/__init__.py", line 443, in __getattr__
    knl = Kernel(self, attr)
          ^^^^^^^^^^^^^^^^^^
TypeError: __init__(): incompatible function arguments. The following argument types are supported:
    1. __init__(self, arg0: pyopencl._cl._Program, arg1: str, /) -> None

Invoked with types: pyopencl._cl.Kernel, pyopencl.Program, str

Process finished with exit code 1

Kroz ★★★★★
() автор топика
Последнее исправление: Kroz (всего исправлений: 1)

Какая-то несовместимость каких-то либ с чем-то. Попробуй не на 3.12 питоне, а на более старом запустить. У меня твой пример нормально отработал:

$ python ocl1.py 
/home/test/p310/lib/python3.10/site-packages/pytools/persistent_dict.py:52: RecommendedHashNotFoundWarning: Unable to import recommended hash 'siphash24.siphash13', falling back to 'hashlib.sha256'. Run 'python3 -m pip install siphash24' to install the recommended hash.
  warn("Unable to import recommended hash 'siphash24.siphash13', "
Choose platform:
[0] <pyopencl.Platform 'AMD Accelerated Parallel Processing' at 0x7fb494df0ff0>
[1] <pyopencl.Platform 'Portable Computing Language' at 0x7fb49dfbd008>
Choice [0]:0
Choosing only available device: <pyopencl.Device 'gfx1100' on 'AMD Accelerated Parallel Processing' at 0x55f76d446a20>
Set the environment variable PYOPENCL_CTX='0' to avoid being asked again.
/home/test/p310/lib/python3.10/site-packages/pyopencl/cache.py:420: CompilerWarning: Non-empty compiler output encountered. Set the environment variable PYOPENCL_COMPILER_OUTPUT=1 to see more.
  prg.build(options_bytes, [devices[i] for i in to_be_built_indices])
Error:
[0. 0. 0. ... 0. 0. 0.]
Norm: 0.0000000000000000e+00

И ещё. По моему опыту работать стоит в виртуальном окружении питона. Например, python -m venv p310 затем source p310/bin/activate и использовать созданное окружение. В том числе все либы для питона потом ставить не из реп дистра, а через pip install

anonymous_incognito ★★★★★
()
Последнее исправление: anonymous_incognito (всего исправлений: 1)