Могут ли переменные типа int передаваться с хоста на устройство в PyCUDA? - PullRequest
1 голос
/ 21 января 2020
    import pycuda.driver as cuda
    import pycuda.autoinit
    from pycuda.compiler import SourceModule
    import numpy as np
    dims=img_in.shape
    rows=dims[0]
    columns=dims[1]
    channels=dims[2]
    #To be used in CUDA Device
    N=columns
    #create output image matrix
    img_out=np.zeros([rows,cols,channels])

     #Convert img_in pixels to 8-bit int
     img_in=img_in.astype(np.int8)
     img_out=img_out.astype(np.int8)

     #Allocate memory for input image,output image and N
     img_in_gpu = cuda.mem_alloc(img_in.size * img_in.dtype.itemsize)
     img_out_gpu= cuda.mem_alloc(img_out.size * img_out.dtype.itemsize)
     N=cuda.mem_alloc(N.size*N.dtype.itemsize)

     #Transfer both input and now empty(output) image matrices from host to device
     cuda.memcpy_htod(img_in_gpu, img_in)
     cuda.memcpy_htod(img_out_gpu, img_out)
     cuda.memcpy_htod(N_out_gpu, N)
     #CUDA Device
     mod=SourceModule("""
                      __global__ void ArCatMap(int *img_in,int *img_out,int *N)
                      {
                         int col = threadIdx.x + blockIdx.x * blockDim.x;
                         int row = threadIdx.y + blockIdx.y * blockDim.y;

                         int img_out_index=col + row * N;
                         int i=(row+col)%N;
                         int j=(row+2*col)%N;
                         img_out[img_out_index]=img_in[]

                      }""")

                     func = mod.get_function("ArCatMap")

                     #for i in range(1,385):
                     func(out_gpu, block=(4,4,1))

                     cuda_memcpy_dtoh(img_out,img_in)
                     cv2_imshow(img_out)

То, что у меня есть, это изображение 512 X 512. Я пытаюсь преобразовать все элементы входного изображения img_in в 8-битный int, используя numpy .astype. То же самое делается для матрицы выходного изображения img_out. Когда я пытаюсь использовать cuda.mem_allo c (), я получаю сообщение об ошибке, в котором говорится, что «тип int не имеет атрибута с именем size», а «тип int не имеет атрибута с именем dtype». Также я получаю сообщение об ошибке «int не имеет атрибута astype». Не могли бы вы указать возможные причины?

1 Ответ

1 голос
/ 21 января 2020

Вы получаете ошибку python. Вы определили N как N=dims[1], так что это всего лишь одно целое число. Вы не можете также вызывать функцию size для целых чисел, они имеют размер 1. Точно так же вы не можете проверить, какой тип является int, потому что это int. Вы делаете это в вызове cuda.mem_alloc.

Вам не нужно выделять память для одного целого, вы можете просто передать его по значению. Определите ядро ​​как __global__ void ArCatMap(int *img_in,int *img_out,int N) вместо передачи указателя.

...