Проблема в вызове Pycuda для ядра: «Ни одному зарегистрированному конвертеру не удалось получить значение C ++ ...» - PullRequest
0 голосов
/ 10 апреля 2020

В приведенном ниже коде выдается следующая ошибка:

"Ни один из зарегистрированных преобразователей не смог создать значение C ++ типа unsigned int из этого Python объекта типа numpy .int32" в вызове f_tri (data3_gpu, data2_gpu, data1_gpu, a_gpu, PointsZ, PointsY, PointsX, size1 [0], block = (256,1,1), grid = grid1)

Я не знаю в вызове переменной это должно быть uint32. Код CUDA компилируется Ok.

Может ли кто-нибудь мне помочь?

Спасибо,

Луис Гонсалвеш

import pycuda.gpuarray as gpuarray
import pycuda.driver as cuda
import pycuda.autoinit
from pycuda.compiler import SourceModule
import numpy as np
mod = SourceModule("""
__global__ void Function(int *zs,int *ys,int *xs, unsigned char *a_gpu, int maxz, int maxy, int maxx, int nrtri)
{
     //some code
}
""")

def main20():
    cuda.init()
    PointsX=np.int32(1000)
    PointsY=np.int32(1000)
    PointsZ=np.int32(1000)
    size1=np.asarray(315645)
    Step1=0.5
    minx=-100.0
    miny=-121.0
    minz=-111.0
    PointsS=(size1[0])*3
    global data
    data=np.full((PointsS,3),np.float32(0.0))
    #fill "data" with values
    f_tri = mod.get_function("Function")
    arrayXYZ=np.full((PointsZ*PointsY*PointsX),np.uint8(0))
    a_gpu = gpuarray.zeros((PointsZ*PointsY*PointsX), dtype=np.uint8)
    data1=np.int_((np.array(data[0::1,0])-np.float32(minx))*np.float32(1/Step1)+np.float32(0.5))
    data2=np.int_((np.array(data[0::1,1])-np.float32(miny))*np.float32(1/Step1)+np.float32(0.5))
    data3=np.int_((np.array(data[0::1,2])-np.float32(minz))*np.float32(1/Step1)+np.float32(0.5))

    data3_gpu = gpuarray.to_gpu(data3)
    data2_gpu = gpuarray.to_gpu(data2)
    data1_gpu = gpuarray.to_gpu(data1)
    grid1=((size1[0] >> 8)+1,1)
    f_tri(data3_gpu, data2_gpu, data1_gpu, a_gpu,PointsZ,PointsY,PointsX, size1[0], block=(256,1,1),grid=grid1)
    cuda.memcpy_dtoh(arrayXYZ, a_gpu)
    #continues

if __name__ == '__main__':
    main20()

Теперь выдает: "cuCtxSynchronize failed: был обнаружен недопустимый доступ к памяти "при обращении к ядру.

    arrayXYZ=np.full((PointsZ*PointsY*PointsX),np.uint8(0))


    data1=np.int_((np.array(data[0::1,0])-np.float32(minx))*np.float32(1/Step1)+np.float32(0.5))

    data2=np.int_((np.array(data[0::1,1])-np.float32(miny))*np.float32(1/Step1)+np.float32(0.5))

    data3=np.int_((np.array(data[0::1,2])-np.float32(minz))*np.float32(1/Step1)+np.float32(0.5))

    data3_gpu = cuda.mem_alloc(data3.nbytes)
    data2_gpu = cuda.mem_alloc(data2.nbytes)
    data1_gpu = cuda.mem_alloc(data1.nbytes)
    #a_gpu = cuda.mem_alloc(arrayXYZ.nbytes)
    cuda.memcpy_htod(data3_gpu, data3)
    cuda.memcpy_htod(data2_gpu, data2)
    cuda.memcpy_htod(data1_gpu, data1)
    #cuda.memcpy_htod(a_gpu, arrayXYZ)
    dados=np.asarray([PointsZ , PointsY , PointsX, size2])
    dados_gpu = cuda.mem_alloc(dados.nbytes)
    cuda.memcpy_htod(dados_gpu, dados)
    f_tri = mod.get_function("Function")
    f_tri(data3_gpu, data2_gpu, data1_gpu, cuda.InOut(arrayXYZ),dados_gpu, block=(32,1,1),grid=(int((size2 >> 5)+1),1,1))
    #cuda.memcpy_dtoh(arrayXYZ, a_gpu)

Если я раскомментирую (все комментарии) и заменю" cuda.InOut (arrayXYZ) "на" a_gpu "при обращении к ядро, ядро ​​работает, но выдает «cuMemcpyDtoH не удалось: обнаружен недопустимый доступ к памяти» в cuda.memcpy_dtoh.

Что-то в ядре? Ядро имеет (много) расхождение. Я надеюсь, что аппаратное обеспечение или прошивка от Nvidia справится с этим.

...