Numpy 如何将CUDA内核函数中的内核输入数据结构与pycuda中的参数输入关联起来

Numpy 如何将CUDA内核函数中的内核输入数据结构与pycuda中的参数输入关联起来,numpy,cuda,gpu,pycuda,Numpy,Cuda,Gpu,Pycuda,我正在编写一个cuda内核,将rgba图像转换为pycuda中的灰度图像,以下是pycuda代码: import numpy as np import matplotlib.pyplot as plt import pycuda.autoinit import pycuda.driver as cuda from pycuda.compiler import SourceModule kernel = SourceModule(""" #include <stdio.h> __glo

我正在编写一个cuda内核,将rgba图像转换为pycuda中的灰度图像,以下是pycuda代码:

import numpy as np
import matplotlib.pyplot as plt
import pycuda.autoinit
import pycuda.driver as cuda
from pycuda.compiler import SourceModule
kernel = SourceModule("""
#include <stdio.h>
__global__ void rgba_to_greyscale(const uchar4* const rgbaImage,
                   unsigned char* const greyImage,
                   int numRows, int numCols)
{
  int y = threadIdx.y+ blockIdx.y* blockDim.y;
  int x = threadIdx.x+ blockIdx.x* blockDim.x;
  if (y < numCols && x < numRows) {
    int index = numRows*y +x;
    uchar4 color = rgbaImage[index];
    unsigned char grey = (unsigned char)(0.299f*color.x+ 0.587f*color.y + 
    0.114f*color.z);
    greyImage[index] = grey;
 }
}
""")

有人有什么想法吗?谢谢

类对CUDA的内置向量类型(包括
uchar4
)具有本机支持

因此,您可以为内核创建具有正确数据类型的as gpuarray实例,并使用缓冲区将主机映像复制到该gpuarray,然后使用gpuarray作为内核输入参数。作为一个例子(如果我正确理解了您的代码),类似这样的东西可能会起作用:

import pycuda.gpuarray as gpuarray

....

def gpu_rgb2gray(image):
    shape = image.shape
    image_rgb = gpuarray.empty(shape, dtype=gpuarray.vec.uchar4)
    cuda.memcpy_htod(image_rgb.gpudata, image.data)
    image_gray = gpuarray.empty(shape, dtype=np.uint8)

    # Get kernel function
    rgba2gray = kernel.get_function("rgba_to_greyscale")
    # Define block, grid and compute
    blockDim = (32, 32, 1) # 1024 threads in total
    dx, mx = divmod(shape[1], blockDim[0])
    dy, my = divmod(shape[0], blockDim[1])
    gridDim = ((dx + (mx>0)), (dy + (my>0)), 1)
    rgba2gray ( image_rgb, image_gray, np.int32(shape[0]), np.int32(shape[1]), block=blockDim, grid=gridDim)

    img_gray = np.array(image_gray.get(), dtype=np.int)

    return img_gray

这将拍摄32位无符号整数的图像,并将其复制到GPU上的
uchar4
数组,然后将生成的
uchar
数组向上投射回设备上的整数。

您好,很抱歉回复太晚。我在gpuarray中检查了所有内容,它工作得非常好,谢谢!
import pycuda.gpuarray as gpuarray

....

def gpu_rgb2gray(image):
    shape = image.shape
    image_rgb = gpuarray.empty(shape, dtype=gpuarray.vec.uchar4)
    cuda.memcpy_htod(image_rgb.gpudata, image.data)
    image_gray = gpuarray.empty(shape, dtype=np.uint8)

    # Get kernel function
    rgba2gray = kernel.get_function("rgba_to_greyscale")
    # Define block, grid and compute
    blockDim = (32, 32, 1) # 1024 threads in total
    dx, mx = divmod(shape[1], blockDim[0])
    dy, my = divmod(shape[0], blockDim[1])
    gridDim = ((dx + (mx>0)), (dy + (my>0)), 1)
    rgba2gray ( image_rgb, image_gray, np.int32(shape[0]), np.int32(shape[1]), block=blockDim, grid=gridDim)

    img_gray = np.array(image_gray.get(), dtype=np.int)

    return img_gray