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

ted930511

我正在编写一个 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;
 }
}
""")

然而,问题是如何将 uchar4* 与 numpy 数组联系起来。我知道可以修改我的内核函数以接受 int* 或 float*,并使其工作。但我只是想知道如何使上述内核函数在 pycuda 中工作。

下面是主机代码。

def gpu_rgb2gray(image):
    shape = image.shape
    n_rows, n_cols, _ = np.array(shape, dtype=np.int)
    image_gray = np.empty((n_rows, n_cols), dtype= np.int)
    ## HERE is confusing part, how to rearrange image to match unchar4* ??
    image = image.reshape(1, -1, 4)
    # 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)
    # Kernel function
    # HERE doesn't work because of mismatch
    rgba2gray (
        cuda.In(image), cuda.Out(image_gray), n_rows, n_cols,
        block=blockDim, grid=gridDim)
    return image_gray

有人有主意吗?谢谢!

看门人

gpuarray类有CUDA的内置矢量类型(包括原生支持uchar4)。

因此,您可以为内核创建具有正确 dtype 的 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 位无符号整数的图像并将它们复制到uchar4GPU 上的数组,然后将生成的数组向上转换uchar回设备上的整数。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何将xml文本与Python中的先前空元素相关联?

来自分类Dev

如何将私有数据与公共数组成员相关联?

来自分类Dev

Python:如何将Tkinter文本标签与信息相关联并在事件中访问它们?

来自分类Dev

如何将多个ID与MS SQL Server中的单个行相关联?

来自分类Dev

如何将单选按钮值与输入字段相关联

来自分类Dev

如何将动态添加的输入字段与父元素/ id相关联?

来自分类Dev

如何将Wine中的所有文件类型与其相应的本机应用程序相关联?

来自分类Dev

如何将第一列中的名称与重复行相关联?

来自分类Dev

如何将数据输入中的报表输入表单?

来自分类Dev

如何将rgb值与透视投影中的像素位置相关联?

来自分类Dev

如何将Wine中的所有文件类型与其相应的本机应用程序相关联?

来自分类Dev

您如何将.exe文件扩展名与Windows中的程序相关联?

来自分类Dev

如何将内核配置设置与源文件相关联?

来自分类Dev

如何将传单标记与数据库中的对象ID相关联

来自分类Dev

如何将属性与Redis Store中的socket.io对象相关联?

来自分类Dev

如何将集合中的文本文件与fs集合中的图像相关联?

来自分类Dev

如何将音频数据与时间相关联

来自分类Dev

如何从输入字段将数据存储在关联数组中?

来自分类Dev

我应该使用哪种.NET数据结构来将字符串与字符串数组相关联?

来自分类Dev

如何将密钥文件与FileZilla中的站点相关联

来自分类Dev

如何将列标题与具有R和XPath的HTML文档中的列值相关联?

来自分类Dev

反应:将输入字段的值与删除的组件相关联

来自分类Dev

如何将本机应用程序与WINE中的文件类型相关联

来自分类Dev

如何将软件与ServiceNow中的服务器CI相关联?最佳实践

来自分类Dev

如何将变量的 1 个以上因素与数据框中的同一个条目相关联?

来自分类Dev

如何将列表与c#中的每个枚举项相关联

来自分类Dev

如何将 Datadog 中的指标与 Flink 中的执行计划运算符相关联?

来自分类Dev

如何将数据与 .NET Core 中的 SignalR 连接相关联?

来自分类Dev

Javascript - 使用 javascript 将标签与输入相关联

Related 相关文章

  1. 1

    如何将xml文本与Python中的先前空元素相关联?

  2. 2

    如何将私有数据与公共数组成员相关联?

  3. 3

    Python:如何将Tkinter文本标签与信息相关联并在事件中访问它们?

  4. 4

    如何将多个ID与MS SQL Server中的单个行相关联?

  5. 5

    如何将单选按钮值与输入字段相关联

  6. 6

    如何将动态添加的输入字段与父元素/ id相关联?

  7. 7

    如何将Wine中的所有文件类型与其相应的本机应用程序相关联?

  8. 8

    如何将第一列中的名称与重复行相关联?

  9. 9

    如何将数据输入中的报表输入表单?

  10. 10

    如何将rgb值与透视投影中的像素位置相关联?

  11. 11

    如何将Wine中的所有文件类型与其相应的本机应用程序相关联?

  12. 12

    您如何将.exe文件扩展名与Windows中的程序相关联?

  13. 13

    如何将内核配置设置与源文件相关联?

  14. 14

    如何将传单标记与数据库中的对象ID相关联

  15. 15

    如何将属性与Redis Store中的socket.io对象相关联?

  16. 16

    如何将集合中的文本文件与fs集合中的图像相关联?

  17. 17

    如何将音频数据与时间相关联

  18. 18

    如何从输入字段将数据存储在关联数组中?

  19. 19

    我应该使用哪种.NET数据结构来将字符串与字符串数组相关联?

  20. 20

    如何将密钥文件与FileZilla中的站点相关联

  21. 21

    如何将列标题与具有R和XPath的HTML文档中的列值相关联?

  22. 22

    反应:将输入字段的值与删除的组件相关联

  23. 23

    如何将本机应用程序与WINE中的文件类型相关联

  24. 24

    如何将软件与ServiceNow中的服务器CI相关联?最佳实践

  25. 25

    如何将变量的 1 个以上因素与数据框中的同一个条目相关联?

  26. 26

    如何将列表与c#中的每个枚举项相关联

  27. 27

    如何将 Datadog 中的指标与 Flink 中的执行计划运算符相关联?

  28. 28

    如何将数据与 .NET Core 中的 SignalR 连接相关联?

  29. 29

    Javascript - 使用 javascript 将标签与输入相关联

热门标签

归档