В приведенном ниже коде выдается следующая ошибка:
"Ни один из зарегистрированных преобразователей не смог создать значение 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 справится с этим.