- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我正在开发 OpenCL 1.2 处理大型图像的应用程序。
目前,我正在测试的图像是 16507x21244 像素。我的 内核在一个循环中运行,该循环对图像的 block 进行操作.内核将 32bpp (rgba) 的图像 block 放入,并将 float4-pixel block 传递出去。
让我们以像素为单位将(方形) block 的一侧定义为 block 大小。也就是说,一个 8192x8192 像素正方形的 block 大小为 8192 .当然,如果图像不能完全被 block 大小整除,则在右侧和底部我们有更小的矩形 block 。我的代码处理了这个问题,但对于本文的其余部分,为了简单起见,让我们忽略它。
我是试图确定最大块大小 我可以在循环的每次迭代中进行操作,以及最佳 block 大小(可能不是最大块大小)。
供引用,here is the information reported by the clinfo utility on my machine .我在 Geforce GTX 560 Ti
上运行我的内核Nvidia 平台使用其专有的 linux 驱动程序。
我最初的天真假设是我可以在最大 2d 图像大小上进行操作。
但是,这会导致 clEnqueueNDRangeKernel
返回错误代码 -4 ( CL_MEM_OBJECT_ALLOCATION_FAILURE
)。
仔细想想,这对我来说很有意义。对于 1 GiB 的视频内存,人们期望能够保存单个 16384x16384 像素纹理 (32bpp) 或 8192x8192 像素纹理 (float4)。如果在内核运行时两者都需要缓存在卡上,我们可以预期使用以下内存量:
4 bytes-per-pixel * chunk size^2 (input image)
+ 16 bytes-per-pixel * chunk size^2 (output image)
= 1 GiB total video memory
chunk size = sqrt(1GiB/20)
floor(sqrt(1072889856/20)) = 7324
CL_MEM_OBJECT_ALLOCATION_FAILURE
.
floor(sqrt(268222464/16)) = 4094
CL_MEM_OBJECT_ALLOCATION_FAILURE
.我不知道为什么最大值似乎是 6784,我不知道这是否可重复或值是否波动(例如视频内存中存在的其他状态会影响它可以容纳多少。)我还发现运行6784 的 block 大小比使用基于最大分配的大小运行慢几秒钟。我想知道这是否是因为 OpenCL 需要在后台执行多个(昂贵的)分配?我还注意到 OpenCL 能够报告的“内核参数的最大大小”(
CL_DEVICE_MAX_PARAMETER_SIZE
)。然而,这个值(value)似乎是虚假的。如果我只能传入 4096 字节,那将限制我为 16x16 像素!
最佳答案
要回答您的直接问题:
1) 要确定可用于单个内核操作的绝对最大块大小,必须知道“ block 大小”指的是什么。例如,OpenCL 内存结构中有五个已定义的内存模型。其中之一是主机内存,我们将忽略它。其他四个是全局的、常量的、本地的和私有(private)的。
要获取有关您的硬件可以支持什么的任何信息,我强烈建议您访问底部记录的 Khronos API 文档。您可以收集大量有关您设备的元数据。例如,查询设备可以支持的 2D 和/或 3D 图像的最大高度和最大宽度。我还建议查看 CL_DEVICE_LOCAL_MEM_SIZE 和 CL_DEVICE_MAX_COMPUTE_UNITS 来定义您的工作组。甚至还有一个允许的 CL_DEVICE_MAX_MEM_ALLOC_SIZE 查询。
指出您对性能的关注是因为为您提供的内存大小是工作组或项目的最佳最大大小(取决于查询)。可能发生的事情是内存溢出到全局空间。这需要在不同的工作人员之间分配更多的内存,从而导致性能下降。该声明不是 100% 确定的,但是当您超过建议的缓冲区大小时,它很可能是问题的一部分。
2) 确定最快的 block 大小不需要反复试验。在 Addison-Wesley 出版的“OpenCL Programming Guide”一书中,有一节介绍了在主机应用程序中使用事件进行分析。有一组功能可以被分析。这些功能如下:
关于image-processing - 如何确定我可以安全地传入/传出 OpenCL 内核的最大图像大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34459915/
Intel、AMD 和 Khronos OpenCL 之间有什么区别。我对 OpenCL 完全陌生,想从它开始。我不知道在我的操作系统上安装哪个更好。 最佳答案 OpenCL 是 C 和 C++ 语言
我在这里的一篇文章中看到,我们可以从 OpenCL 内核调用函数。但是在我的情况下,我还需要并行化该复杂函数(由所有可用线程运行),所以我是否必须将该函数也设为内核并像从主内核中调用函数一样直接调
最近我看到一些开发板支持 OpenCL EP,例如 odroid XU。我知道的一件事是 OpenCL EP 适用于 ARM 处理器,但它与基于主要桌面的 OpenCL 在哪些特性上有所不同。 最佳答
我想知道在 OpenCL 中设置为内核函数的参数数量是否有任何限制。设置参数时出现 INVALID_ARG_INDEX 错误。我在内核函数中设置了 9 个参数。请在这方面帮助我。 最佳答案 您可以尝试
我对零拷贝的工作原理有点困惑。 1-要确认以下内容对应于opencl中的零拷贝。 ....................... . . . .
我是 OpenCL 的初学者,我很难理解某些东西。 我想改进主机和设备之间的图像传输。 我制定了一个计划以更好地了解我。 顶部:我现在拥有的 |底部:我想要的 HtD(主机到设备)和 DtH(设备到主
今天我又加了四个 __local变量到我的内核以转储中间结果。但是只需将另外四个变量添加到内核的签名并添加相应的内核参数就会将内核的所有输出呈现为“0”。没有一个 cl 函数返回错误代码。 我进一步尝
我知道工作项被分组到工作组中,并且您不能在工作组之外进行同步。 这是否意味着工作项是并行执行的? 如果是这样,使用 128 个工作项创建 1 个工作组是否可能/有效? 最佳答案 组内的工作项将一起安排
我相当确定经纱仅在 CUDA 中定义。但也许我错了。就 OpenCL 而言,什么是扭曲? 它与工作组不一样,是吗? 任何相关的反馈都受到高度赞赏。谢谢! 最佳答案 它没有在 OpenCL 标准中定义。
已结束。此问题正在寻求书籍、工具、软件库等的推荐。它不满足Stack Overflow guidelines 。目前不接受答案。 我们不允许提出寻求书籍、工具、软件库等推荐的问题。您可以编辑问题,以便
在OpenCL中,我的理解是可以使用barrier()函数来同步工作组中的线程。我(通常)确实了解它们的用途以及何时使用它们。我还知道工作组中的所有线程都必须遇到障碍,否则会出现问题。然而,到目前为止
我的主板上有 Nvidia 显卡 (GeForce GT 640)。我已经在我的盒子上安装了 OpenCL。当我使用“clGetPlatformInfo(参数)”查询平台时,我看到以下输出:-#可用平
我目前正在构建一个 ray marcher 来查看像 mandelbox 等东西。它工作得很好。但是,在我当前的程序中,它使用每个 worker 作为从眼睛转换的光线。这意味着每个 worker 有大
我编写了两个不同的 openCl 内核,使用 nvidia profiler 获取了有关它们的一些信息,发现两者每个工作项都使用 63 个寄存器。 我尝试了一切我能想到的方法来降低这个数字(用 ush
我的主板上有 Nvidia 显卡 (GeForce GT 640)。我已经在我的盒子上安装了 OpenCL。当我使用“clGetPlatformInfo(参数)”查询平台时,我看到以下输出:-#可用平
我目前正在构建一个 ray marcher 来查看像 mandelbox 等东西。它工作得很好。但是,在我当前的程序中,它使用每个 worker 作为从眼睛转换的光线。这意味着每个 worker 有大
我正在尝试使用 OpenCL 加速一些计算,算法的一部分包括矩阵求逆。是否有任何开源库或免费可用的代码来计算用 OpenCL 或 CUDA 编写的矩阵的 lu 分解(lapack dgetrf 和 d
我正在尝试在 OpenCL 内核中使用递归。编译成功,但运行时出现编译错误,所以我想知道,由于 CUDA 现在支持动态并行,OpenCL 是否支持动态并行? 最佳答案 OpenCL 不支持递归。请参阅
考虑以下代码,它从大小为 size 的 double 组创建缓冲区内存对象: coef_mem = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM
OpenCL 中目标平台的示例是什么?例如,它是 Windows、Android、Mac 等操作系统,还是设备中的实际芯片? 最佳答案 OpenCL 平台本质上是一个 OpenCL 实现。它与操作系统
我是一名优秀的程序员,十分优秀!