【发布时间】:2018-08-10 12:35:42
【问题描述】:
我有一个 C# 项目,我在其中从相机中检索灰度图像并使用图像数据进行一些计算。这些计算非常耗时,因为我需要多次循环整个图像,而且我都是在 CPU 上完成的。
现在我想尝试在 GPU 上运行评估,但我很难做到这一点,因为我以前从未做过任何 GPU 计算。
该软件应该能够在具有不同硬件的多台计算机上运行,因此 CUDA 对我来说不是一个解决方案,因为代码也应该在只有板载显卡的笔记本电脑上运行。经过一番研究,我遇到了 Cloo (found it on this project),这似乎是一个相当合理的选择。
到目前为止,我将 Cloo 集成到我的项目中,并尝试让 this hello world 示例运行。我猜它正在运行,因为我没有收到任何异常,但我不知道在哪里可以看到打印输出。
对于我的计算,我需要将图像传递给 GPU,并且在计算过程中我还需要 x-y 坐标。因此,在 C# 中,计算如下所示:
int a = 0;
for (int y = 0; y < img_height; y++){
for (int x = 0; x < img_width; x++){
a += image[x,y] * x * y;
}
}
int b = 0;
for (int y = 0; y < img_height; y++){
for (int x = 0; x < img_width; x++){
b += image[x,y] * (x-a) * y;
}
}
现在我想让这些计算在 GPU 上运行,并且我想并行 y-loop,以便在每个任务中运行一个 x-loop。然后我可以在第二个循环块开始之前获取所有结果 a 值并将它们相加。
之后我想将值 a 和 b 返回到我的 C# 代码并在那里使用它们。
所以,结束我的问题:
- 对于这项任务,Cloo 是一个值得推荐的选择吗?
- 将图像数据(16 位、短数组)和尺寸(
img_width、img_height)传递到 GPU 的最佳方式是什么? - 如何从 GPU 返回值?据我所知,内核总是被用作
kernel void... - 实现循环的最佳方法是什么?
我希望我的问题很清楚,并且我提供了足够的信息来了解我的挣扎。任何帮助表示赞赏。提前致谢。
【问题讨论】:
-
两个问题:(A) 您是否已经实现了引用的内核以至少掌握所质疑的领域? (B) 灰度 16 位色深图像 [x:0,?][y:0,?] 的静态尺寸是多少? O/P 的动机实际上会发生 2 倍吗? 20 倍? 200 倍?
-
到目前为止,我只实现了hello world的内核,除此之外什么都没有。这些图像的大小为 1920x1200 像素,我需要在整个图像上进行两个循环,如代码示例中所示,这两个循环在另一个循环中运行大约 10 次。
标签: image-processing parallel-processing opencl gpu cloo