2013-10-14 7 views
0

Когда я пытаюсь запустить следующий код, я получаю эту ошибку:Вызов __device__ функции с использованием PyCuda возвращает ошибку

Traceback (most recent call last): 
    File "C:\temp\GPU Program Shell.py", line 28, in <module> 
    dev=mod.get_function("lol") 
    File "C:\Python33\lib\site-packages\pycuda\compiler.py", line 285, in get_function 
    return self.module.get_function(name) 
pycuda._driver.LogicError: cuModuleGetFunction failed: not found 

Вот код:

mod = SourceModule(""" 

extern "C" { 
__device__ void lol(double *a) 
{ 
    a[0]=1; 
} 


__global__ void kernel(double *a) 
{ 
    const int r = blockIdx.x*blockDim.x + threadIdx.x; 
    a[r] = 1; 
} 
} 
""") 

max_length = 5 
a = numpy.zeros(max_length) 
a_gpu = cuda.mem_alloc(a.nbytes) 
cuda.memcpy_htod(a_gpu, a) 
func = mod.get_function("kernel") 
dev=mod.get_function("lol") 
dev(a_gpu) 
newa = numpy.empty_like(a) 
cuda.memcpy_dtoh(newa, a_gpu) 

print(newa) 
print(a) 

Как вы можете видеть, это небольшая модификация кода учебника PyCUDA. Я намерен назвать эту функцию устройства, которая собирается запускать ядра и интегрировать вещи и, как правило, облегчать мою жизнь. Я немного поработал в поисковых системах, и я знал, что мне нужно положить «extern» c «» в мой код из-за перекоса имени и добиться успеха с этим раньше, когда я просто использовал PyCUDA для запуска ядра вместо функции устройства. В тех же строках, если я изменю свой код для запуска ядра вместо функции устройства, он делает то, что я хочу. Что мне здесь не хватает?

Карстен

Немного больше смотрит в Справочной документации интерфейса устройства и, кажется, функция get_function имеет дело только с глобальных функций? Правильно ли я это интерпретировал? Если да, могу ли я делать то, что я пытаюсь сделать?

ответ

1

Вы не можете вызвать функцию __device__ из кода хоста. Если вы указываете, что код учебника PyCUDA показывает, как это сделать, я бы хотел увидеть этот учебник.

Непонятно, что вы пытаетесь выполнить с помощью функции __device__ из кода хоста, который не может быть выполнен с обычным ядром (__global__).

+0

Правильно Роберт, я понял, что это был немой вопрос не слишком долго после того, как я спросил его. То, что я пытаюсь сделать, это написать интегратор, который работает исключительно на gpu после отправки его начальных условий и параметров. Я хотел, чтобы функция устройства (к которой я теперь использую только одно ядро) для запуска интегратора и возможность вызова других ядер для выполнения интеграции. –

+0

Вы можете запустить ядро ​​'__global__' только с одним блоком одного потока, который должен вести себя так же, как и функция' __device__', которую вы имеете в виду. Не пытайтесь прокомментировать общую идею, просто механику. –

+0

Да, это то, что я пытаюсь сделать прямо сейчас. Вы думаете, что это плохая идея? –

 Смежные вопросы

  • Нет связанных вопросов^_^