Функция вызова устройства из глобальной функции в pycuda

Я новичок в PyCUDA. Я хочу вызвать функцию, объявленную с помощью __device__, из функции, объявленной с помощью __global__. Как я могу сделать это в pyCUDA?

import pycuda.driver as cuda  
from pycuda.compiler import SourceModule  
import numpy as n  
import pycuda.autoinit  
import pycuda.gpuarray as gp

d=gp.zeros(shape=(128,128),dtype=n.int32)  
h=n.zeros(shape=(128,128),dtype=n.int32)  
mod=SourceModule("""  
      __global__ void  matAdd(int *a)  
    {  
            int px=blockIdx.x*blockDim.x+threadIdx.x;  
            int py=blockIdx.y*blockDim.y+threadIdx.y;         
            a[px*128+py]+=1;   
            matMul(px);

    }  
      __device__ void matMul( int px)
    {
      px=5;
    }  

""")

m=mod.get_function("matAdd")  
m(d,block=(32,32,1),grid=(4,4))  
d.get(h)  

Выше код дает мне следующую ошибку

7-linux-i686.egg/pycuda/../include/pycuda kernel.cu]  
[stderr:  
kernel.cu(8): error: identifier "matMul" is undefined  

kernel.cu(12): warning: parameter "px" was set but never used  

1 error detected in the compilation of "/tmp/tmpxft_00002286_00000000-6_kernel.cpp1.ii".  
]  

person username_4567    schedule 10.08.2012    source источник
comment
Я не уверен, что понимаю вопрос. В PyCUDA вы по-прежнему пишете код устройства на CUDA C. Это ничем не отличается от того, если вы написали код хоста на C++, а не на Python. Так что же вы спрашиваете?   -  person talonmies    schedule 10.08.2012


Ответы (1)


Вы должны объявить свою функцию matMul перед обращением к ней. Вы можете сделать это следующим образом:

  __device__ void matMul( int px); // declaration
  __global__ void  matAdd(int *a)  
{  
        int px=blockIdx.x*blockDim.x+threadIdx.x;  
        int py=blockIdx.y*blockDim.y+threadIdx.y;         
        a[px*128+py]+=1;   
        matMul(px);

}  
  __device__ void matMul( int px) // implementation
{
  px=5; // by the way, this assignment does not propagate outside this function
}  

, или просто переместите всю функцию matMul перед matAdd.

person aland    schedule 10.08.2012
comment
Это приемлемое решение для данной ситуации, но что, если matMul определен в отдельном классе SourceModule? Та же ошибка продолжается.. - person username_4567; 10.08.2012
comment
comment
Я использую CUDA 5, я знаю этот факт, но в PyCUDA мы можем скомпилировать отдельные такие функции? Потому что, если у меня будет слишком много функций, мне будет трудно управлять в одном объекте. - person username_4567; 10.08.2012
comment
Технически можно использовать pycuda.compiler.compile для тонкой настройки компиляции сабюнитов, а потом как-то связать их, но мне пока не удалось заставить это работать... - person aland; 10.08.2012
comment
Да... даже я так думал, но я не смог использовать pycuda.compiler.compile - person username_4567; 10.08.2012
comment
Похоже, в настоящее время это невозможно: pyCUDA ожидает, что nvcc создаст файл .cubin, а затем использует cuModuleLoadDataEx, но нет возможности связать два файла .cubin в один файл .cubin. - person aland; 10.08.2012