问题标签 [cloo]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - 如何将大缓冲区传递给 OpenCL 设备?
我正在使用 OpenCL (Cloo.dll) 在 C# 上编写程序,我需要将大缓冲区传递给 OpenCL ComputeDevice。当我将此缓冲区传递给 OpenCL ComputeDevice 时 - 程序崩溃,没有任何异常或错误。
代码:
OpenCL 内核:
我读到了 ComputeDevice.MaxParameterSize - 可以传递给设备的最大参数大小。在我看来,问题就在这里,因为可以很好地传递小缓冲区(大小 < 1KB)。我的设备中的 MaxParameterSizes 是 1024 和 4096 字节,但这些值非常小。我需要传递大小超过 100 MB 的缓冲区。
如何将大缓冲区传递给设备?我可以只传递一个指向这个缓冲区的指针吗?
我的 OpenCL 设备:
AMD Radeon HD8750M 2048MB,
英特尔酷睿 I3 4000M + 6GB 内存
编辑:
由于内核处理uchar16
数据,我必须将 GlobalSize 设置为buffer.size / 16
.
我只更改了一行代码(缓冲区大小除以 16):
一切正常。感谢大家!!!)
c# - 在 C# 中使用 Cloo 时,ComputePlatform.Platforms.Count 为零,即使我安装了显卡(显然)
我需要在 C# 中使用 Cloo 访问我的显卡。当我尝试通过 ComputePlatform.Platforms 访问它时,此列表为空。我的驱动程序是最新的,我试过这样做是 Visual Studio 2013 和 2015,但没有结果。请帮忙!
optimization - OpenCL 为吞吐量选择最佳设备
我正在使用 OpenCL C# 库 Cloo,我想知道如何才能最好地确定在运行时将哪个设备用于我的内核。我真正想知道的是我在 GPU 上有多少个内核(计算单元 * 每个计算单元的内核数)。我该如何正确地做到这一点?我目前可以确定计算单位和频率。
编辑:我考虑过尝试在所有设备上分析(运行速度测试)并保存/比较结果。但是,据我了解,这也带来了一个问题,因为您无法编写一个最佳/公平地使用所有设备进行比较的程序。
这对于为每个内核调用选择最佳数量的工作线程也很有用。任何帮助是极大的赞赏。
c# - OpenCL Cloo:资源不足错误
在 OpenCL 中运行一些测试代码(使用 Cloo C#)时,我开始从 OpenCL 中获取这些 OutOfResource 错误,有时 Unity 在出现异常之前就完全崩溃了。我基本上是用不同数量的全局/本地工作项一遍又一遍地重新调用内核函数来检查时间。我将参数保持不变,并以 2x2x2 全局和 2x2x2 局部开始调用内核,并向上迭代,仅检查有效大小。它偶尔可以正常工作,但大多数时候它会完成大约 30 或 40 次 Execute() 调用,然后在下一次 Execute() 调用时崩溃。
注意:执行是指计算机上的 OpenCL.dll。由于本机代码,我假设 Unity 返回的堆栈跟踪为 NULL。
任何人都知道可能导致这种情况的原因是什么?
注意:这个版本的 Cloo 是来自 GitHub 的 Cloo-Unity,我在 Unity 中使用它。当我收到错误时调用的等效 OpenCL 函数是 clEnqueueNDRangeKernel(),但在 Cloo 中它被称为 Execute()。
代码示例:
c# - C#/OpenCL - 二维数组作为内核参数
我正在使用 C# 的 Cloo 库。
我无法弄清楚或找到有关如何将 2D 数组添加为内核参数的任何信息。
这是我的代码:
它只是给了我错误:'无法从 char[,] 转换为 long'。暗示它将其视为其他重载之一。
我究竟做错了什么?
c# - 我是否正确地重用了 OpenCL/Cloo(C#) 对象?
我正在试验 OpenCL(通过 Cloo 的 C# 接口)。为此,我正在尝试使用 GPU 上的常规矩阵乘法。问题是,在我的速度测试期间,应用程序崩溃了。我正在努力提高各种 OpenCL 对象的重新分配效率,我想知道这样做是否在搞砸。
我将把代码放在这个问题中,但为了更大的图景,你可以从 github 获取代码:https ://github.com/kwende/ClooMatrixMultiply
我的主程序这样做:
所以我基本上是在调用NumberOfIterations次,并计算平均执行时间。
在MultiplyMatrices调用中,第一次通过时,我调用 Initialize 来设置我要重用的所有对象:
然后我输入我的函数的主体(将执行NumberOfIterations次的部分)。
第三次或第四次(它有点随机,暗示内存访问问题),程序崩溃。这是我的内核(我确信有更快的实现,但现在我的目标只是让某些东西正常工作而不会爆炸):
最终的目标是更好地理解 OpenCL 的零拷贝特性(因为我使用的是 Intel 的集成 GPU)。我一直无法让它工作,所以想退后一步,看看我是否理解更基本的东西......显然我不明白,因为我什至无法让它在不爆炸的情况下工作。
我能想到的唯一另一件事是我如何固定指针以将其发送到 .Read() 函数。但我不知道有什么替代方案。
编辑:
对于它的价值,我将代码的最后一部分(读取的代码)更新为此,它仍然崩溃:
编辑#2
huseyin tugrul buyukisik 找到的解决方案(见下面的评论)。
放置时
最后,一切正常。
c# - 在我的 OpenCL/Cloo(C#) 程序中,“零拷贝”比非零拷贝慢
这可能只是.NET框架分配的内存对象没有正确页面对齐的问题,但我不明白为什么零拷贝对我来说比非零拷贝慢。
我将在这个问题中包含内联代码,但可以在此处查看完整的源代码:https ://github.com/kwende/ClooMatrixMultiply/blob/master/GiantMatrixOnGPU/GPUMatrixMultiplier.cs 。
由于这是我第一次尝试让零拷贝工作,我写了一个简单的矩阵乘法示例。我首先初始化我的 OpenCL 对象:
...如果我的代码尚未初始化,这只会执行一次。然后我进入主体。对于非零副本,我执行以下操作:
您可以看到我如何为我的所有 ComputeBuffer 分配显式设置 CopyHostPointer。这执行得很好。
然后我对(包括设置“UseHostPointer”和调用 Map/Unmap 而不是 Read)进行以下调整:
然而,时机说明了一切。我的程序吐出这个:
CPU矩阵乘法:1178.5ms
GPU矩阵乘法(复制):115.1ms
GPU矩阵乘法(零拷贝):174.1ms
GPU(带副本)快 10.23892 倍。
GPU(零拷贝)快 6.769098 倍。
...所以零拷贝速度较慢。
c# - 如何减少 OpenCL/Cloo (C#) 的缓冲区创建开销?
我通过 C# Cloo 接口使用 OpenCL,当我试图让它在我们的产品中运行良好时遇到了一些非常令人沮丧的问题。
我们的产品是一种计算机视觉产品,它以每秒 30 次的速度从我们的相机中获取 512x424 的像素值网格。我们希望对这些像素进行计算,以生成相对于场景中某些对象的点云。
我正在尝试计算这些像素的是,当我们得到一个新帧时,以下(每一帧):
1) 创建一个 CommandQueue,2) 创建一个对输入像素值只读的缓冲区,3) 创建一个仅对输出点值写入的零拷贝缓冲区。4) 传入用于在 GPU 上进行计算的矩阵,5) 执行内核并等待响应。
每帧工作的一个例子是:
分析时,时间太长了,90% 的时间用于创建所有 ComputeBuffer 对象等。GPU 上的实际计算时间尽可能快。
我的问题是,我该如何解决这个问题?输入的像素数组对于每一帧都是不同的,所以我必须为此创建一个新的 ComputeBuffer。当我们更新场景时,我们的矩阵也可以定期更改(同样,我无法深入了解所有细节)。有没有办法在 GPU 上更新这些缓冲区?我使用的是 Intel GPGPU,所以我有共享内存,理论上可以做到这一点。
这变得令人沮丧,因为我在 GPU 上发现的速度提升一次又一次被为每一帧设置所有内容的开销所淹没。
编辑1:
我不认为我的原始代码示例真正展示了我做得足够好,所以我创建了一个真实的工作示例并将其发布在 github上。
由于遗留原因和时间原因,我无法更改我们当前产品的太多压倒一切的架构。我试图在某些速度较慢的部分“插入”GPU代码以加快速度。考虑到我所看到的限制,这可能是不可能的。但是,让我更好地解释我在做什么。
我将给出代码,但我将指代“GPUComputePoints”类中的函数“ComputePoints”。
正如您在我的 ComputePoints 函数中看到的那样,每次传入一个 CameraFrame 以及转换矩阵 M 和 b。
这些是从我们的管道生成的新数组,而不是我可以闲逛的数组。所以我为每个创建一个新的 ComputeBuffer:
...我相信,这就是性能的消耗。有人提到要解决这个问题,请使用 map/unmap 功能。但是我看不出这会有什么帮助,因为我仍然需要每次都创建缓冲区来封装传入的新数组,对吧?
c# - 如何使用 Cloo 和 .NET 解决 OpenCL 内核构建错误?
我目前正在使用 VS2013。我创建了一个非常简单的 C# 解决方案,旨在将 Cloo 与一个简单的类一起使用:
虽然我在 Visual Studio 中构建解决方案没有任何问题,但我不断收到“检测到 OpenCL 错误代码:BuildProgramFailure ”。尝试使用“ program.Build(null, null, null, IntPtr.Zero) ”构建程序时。内核代码看起来不错,但我已经在这工作了几个晚上,似乎无法弄清楚发生了什么。你可能会说我对 Cloo 很陌生,我从网上的例子中得到了一些想法,但我可能在一个非常简单的层面上做错了。任何建议都会很棒。
我已经为我的显卡下载了所有最新的 OpenCL 驱动程序。
谢谢
image-processing - GPU上的图像计算和值返回
我有一个 C# 项目,在其中我从相机中检索灰度图像并使用图像数据进行一些计算。计算非常耗时,因为我需要多次循环整个图像,而且我都在 CPU 上完成。
现在我想尝试在 GPU 上运行评估,但我很难做到这一点,因为我以前从未做过任何 GPU 计算。
该软件应该能够在具有不同硬件的多台计算机上运行,因此例如 CUDA 对我来说不是一个解决方案,因为代码也应该在只有板载图形的笔记本电脑上运行。经过一些研究,我遇到了 Cloo(在这个项目中找到了它),这似乎是一个相当合理的选择。
到目前为止,我将 Cloo 集成到我的项目中,并试图让这个hello world 示例运行。我猜它正在运行,因为我没有得到任何异常,但我不知道在哪里可以看到打印输出。
对于我的计算,我需要将图像传递给 GPU,并且在计算过程中我还需要 xy 坐标。因此,在 C# 中,计算如下所示:
现在我想让这些计算在 GPU 上运行,并且我想并行y
循环,以便在每个任务中x
中运行一个 -loop。然后我可以在第二个循环块开始之前获取所有结果 a 值并将它们相加。
之后我想将这些值返回a
到b
我的 C# 代码并在那里使用它们。
所以,总结一下我的问题:
- 对于这项任务,Cloo 是一个值得推荐的选择吗?
- 将图像数据(16 位,短数组)和尺寸(
img_width
,img_height
)传递给 GPU 的最佳方式是什么? - 如何从 GPU 返回值?据我所知,内核总是被用作
kernel void...
- 实现循环的最佳方法是什么?
我希望我的问题很清楚,并且我提供了足够的信息来理解我的挣扎。任何帮助表示赞赏。提前致谢。