我可以将jpeg或mjpeg文件从硬盘驱动器传输到GPU的内存吗?

a_sid

我正在尝试将MJPEG解码器的单线程串行代码转换为我想在GPU(NVIDIA Tesla k20c)上执行的OpenCL代码。

在将几个主要功能转换为内核之后,代码的执行时间从每帧约18 ms变为每帧惊人的400 ms。

我正在使用打开文件,读取文件,使用buffer和ndrange命令在GPU上执行代码并从CPU读取结果的标准方法。我觉得将mjpeg文件(属于数据类型FILE)传输到GPU的内存将大大减少代码处理时的通信开销。

我引用了此链接,但建议仅适用于CUDA。该资源和NVIDIA的OpenCL指南介绍了固定内存的实用程序,但固定内存的使用仅限于内核参数和缓冲区命令。

我想将整个MJPEG文件(大小约为2.8 MB)传输到GPU的内存,但我一直在努力寻找实现这一目标的资源。

我可以安全地这样做吗?如果可以这样做,如何读取文件以执行MJPEG解码的各个步骤?

编辑:

我的GPU的详细信息如下:

DEVICE_NAME = Tesla K20c
DEVICE_VENDOR = NVIDIA Corporation
DEVICE_VERSION = OpenCL 1.2 CUDA
DRIVER_VERSION = 352.21
DEVICE_MAX_COMPUTE_UNITS = 13
DEVICE_MAX_CLOCK_FREQUENCY = 705
DEVICE_GLOBAL_MEM_SIZE = 5032706048
CL_DEVICE_ERROR_CORRECTION_SUPPORT: yes
CL_DEVICE_LOCAL_MEM_TYPE:       local
CL_DEVICE_LOCAL_MEM_SIZE:       48 KByte
CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE: 64 KByte
CL_DEVICE_QUEUE_PROPERTIES:     CL_QUEUE_OUT_OF_ORDER_EXEC_MODE_ENABLE
CL_DEVICE_QUEUE_PROPERTIES:     CL_QUEUE_PROFILING_ENABLE

编辑:

Xirema给了我一个相当令人信服的答案。

如果在jpeg文件位于GPU上之后可以获得读取标记等的建议,我将不胜感激。还有其他巧妙的技巧可以更有效地读取标记吗?

希雷马

没有什么能阻止您将图像的文字数据复制到主机内存中的缓冲区,然后再将其复制到GPU:

//HOST CODE
std::ifstream image_file("img.jpg", std::ios::binary);
std::vector<uint8_t> image_data;
image_file.seekg(0, std::ios_base::end);
size_t size = image_file.tellg();
image_data.resize(size);
image_file.seekg(0, std::ios_base::beg);

image_file.read(reinterpret_cast<char *>(image_data.data()), size);

cl_mem image_buffer = clCreateBuffer(context, CL_MEM_READ_WRITE | CL_MEM_COPY_HOST_PTR, size, image_data.data(), nullptr);

clSetKernelArg(kernel, 0, sizeof(cl_mem), &image_buffer);
clSetKernelArg(kernel, 1, sizeof(size_t), &size);

//DEVICE CODE
kernel void image_manipulation_function(global uchar * data, size_t data_size) {
    //Go crazy.
    //Seriously.
    //(Mostly because you'd *have* to be crazy to think this is a good idea)
}

唯一悬而未决的问题是为什么您要这样做。大多数图像压缩算法都不太适合通常在GPU上解决的“令人尴尬的并行问题”,即使它们确实很好且高效地适应了多线程算法(大约2-16个线程)。除非您不了解某种不公开的实验研究,或者您的实际任务特别深奥,否则您不可能获得任何显着的速度提升。

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

我可以将Windows 7传输到其他硬盘驱动器吗?

通过rsync将大文件从本地硬盘驱动器传输到计算集群

如何将文件流式传输到硬盘驱动器?

如何将硬盘驱动器文件从虚拟计算机传输到主机OS?

将操作系统(Windows 10)传输到更大的硬盘驱动器

我可以将硬盘驱动器克隆到外部并从克隆启动吗?

GPT硬盘驱动器可以读取MBR硬盘驱动器吗?

我可以将非NAS销售的外部硬盘驱动器连接到此路由器并通过网络访问文件吗?

我可以将SATA硬盘驱动器与IBM服务器一起使用吗

将数据传输到外部硬盘驱动器的最快方法是什么?

我可以将多个笔记本硬盘驱动器连接到台式机主板上吗?

我可以将SSD安装到标有SATA AHCI的硬盘驱动器支架中吗

我可以将SATA-II硬盘驱动器连接到SATA-I连接吗?

可以交换Ubuntu硬盘驱动器吗

我可以将第二个硬盘驱动器插入CDROM驱动器的插槽中吗?

我的硬盘驱动器有坏扇区吗?

我可以欺骗Carbonite备份外部硬盘驱动器吗?

我可以使Synology NAS表现得更像普通的外部硬盘驱动器吗?

我可以使用低容量型号的硬盘驱动器PCB吗?

我可以使外部硬盘驱动器可通过ubuntu 13.04启动吗?

我可以在不同的PC上使用一个内部硬盘驱动器吗?

可以从外部硬盘驱动器装载TrueCrypt容器文件吗?

可以将硬盘驱动器添加到RAID吗?

我可以从笔记本电脑中卸下硬盘驱动器,然后将其放置在另一硬盘驱动器中吗?

如果我将Ubuntu刻录到一个内部硬盘驱动器上并启动它以将其安装在另一个硬盘驱动器上,我可以撤消它吗?

我的空间不足,无法提取 .rar 文件,我使用 C: Drive 下载了文件,我可以使用外部硬盘驱动器提取文件吗?

将数据从一个硬盘驱动器传输到另一个硬盘驱动器时,间歇数据存储在哪里?

我可以将PC的主硬盘作为辅助硬盘驱动器放入另一台PC /服务器中以备份文件吗?

PCIe固态驱动器可以存储硬盘驱动器之类的物品吗?