Numpy 如何将CUDA内核函数中的内核输入数据结构与pycuda中的参数输入关联起来
我正在编写一个cuda内核,将rgba图像转换为pycuda中的灰度图像,以下是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
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