代码之家  ›  专栏  ›  技术社区  ›  a_sid

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

  •  2
  • a_sid  · 技术社区  · 7 年前

    我正在尝试翻译单线程 serial code for the MJPEG decoder 我想在GPU上执行的OpenCL代码(NVIDIA特斯拉k20c)。

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

    this link 但这些建议仅适用于CUDA。 This source 和NVIDIA的 OpenCL guide 解释固定内存的效用,但它们对固定内存的使用仅限于内核参数和缓冲区命令。

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

    编辑:

    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
    

    编辑:

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

    1 回复  |  直到 7 年前
        1
  •  2
  •   Xirema    7 年前

    没有什么可以阻止您将图像的文字数据复制到主机内存中的缓冲区,然后将其复制到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)
    }
    

    唯一悬而未决的问题是 为什么?