PyCUDA: может импортировать модуль, тогда я не могу… (Образцы PyCUDA)

#python #import #cuda #pycuda

#python #импорт #cuda #pycuda

Вопрос:

Пример кода:

 import pycuda.autoinit
import pycuda.driver as drv
import numpy

from pycuda.compiler import SourceModule
mod = SourceModule("""
__global__ void multiply_them(float *dest, float *a, float *b)
{
  const int i = threadIdx.x;
  dest[i] = a[i] * b[i];
}
""")

multiply_them = mod.get_function("multiply_them")

a = numpy.random.randn(400).astype(numpy.float32)
b = numpy.random.randn(400).astype(numpy.float32)

dest = numpy.zeros_like(a)
multiply_them(
        drv.Out(dest), drv.In(a), drv.In(b),
        block=(400,1,1), grid=(1,1))

print dest-a*b
  

Результаты:

 Traceback (most recent call last):
  File "test.py", line 12, in <module>
    """)
  File "build/bdist.linux-x86_64/egg/pycuda/compiler.py", line 238, in __init__
  File "build/bdist.linux-x86_64/egg/pycuda/compiler.py", line 223, in compile
  File "build/bdist.linux-x86_64/egg/pycuda/compiler.py", line 149, in _find_pycuda_include_path
ImportError: No module named pycuda
  

Звучит достаточно просто, так что давайте протестируем это.

 Python 2.7.1 (r271:86832, Feb 17 2011, 14:13:40) 
[GCC 4.3.4] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pycuda
>>> pycuda
<module 'pycuda' from '/home/abolster/lib/python2.7/site-packages/pycuda-0.94.2-py2.7-linux-x86_64.egg/pycuda/__init__.pyc'>
>>> 
  

Хорошо, это странно…

Короче говоря, даже переходя по файлу построчно в консоль python, ничего не происходит неправильно до фактического выполнения строки mod=SourceModule().

(Окончательная трассировка, я обещаю)

 /home/abolster/lib/python2.7/site-packages/pycuda-0.94.2-py2.7-linux-x86_64.egg/pycuda/compiler.pyc in _find_pycuda_include_path()
    147 def _find_pycuda_include_path():
    148     from imp import find_module
--> 149     file, pathname, descr = find_module("pycuda")
    150 
    151     # Who knew Python installation is so uniform and predictable?

ImportError: No module named pycuda
  

Похоже, что pycuda получает другие каталоги include, чем runtime python, чего не должно произойти (насколько я понимаю)

Есть идеи? (Извините за длинный вопрос)

Talonmies высказал мнение о том, что nvcc не найден; если python не получает свои envars откуда-то, о чем я не могу думать, нет причин, по которым это не должно :

 [bolster@dellgpu src]$ which nvcc
~/cuda/bin/nvcc
  

Комментарии:

1. Похоже, что-то не так только с pycuda.compiler? Попробуйте импортировать эту строку из консоли, чтобы посмотреть, что получится.

2. Попробуйте добавить import pycuda строку в верхней части вашего скрипта. Помогает ли это?

3. Повторяю: построчный переход через консоль python не вызывает жалоб до выполнения строки mod=SourceModule(…).

4. @Andrew Bolster: и в этот момент pycuda.compiler. Sourcemodule попытается запустить процесс nvcc для компиляции вашего исходного кода в файл cubin. И именно тогда происходит сбой, что обычно означает, что nvcc не может быть найден.

5. @talonmies ну, нет, потому что это не то, где его сбой… Требуется дополнительное расследование, но спасибо, что подключились!

Ответ №1:

Переход на Python 2.6 и переустановка соответствующих модулей устранили проблему для операционной системы.

Ответ №2:

В коде, который вы пытаетесь запустить, нет ничего плохого — он должен работать. Я предполагаю, что nvcc не может быть найден. Убедитесь, что путь к исполняемому файлу nvcc задан в вашей среде, прежде чем пытаться использовать pycuda.compiler.

Ответ №3:

Я думаю, вы не устанавливали CUDA toolkit от nvidia и не добавили

/usr/local/cuda/lib/

Для

LD_LIBRARY_PATH

найдите the .so модуля pycuda и выдайте нам вывод:

 >lld pycuda.so 
  

Комментарии:

1. для pycuda не требуется CUDA SDK. Для этого даже не требуются какие-либо библиотеки из CUDA toolkit — он построен на API драйвера, а не на runtime API.