基于nvJpeg编解码图片

2023-10-27

NvJpeg介绍

nvJPEG库为深度学习和超大规模多媒体应用程序中常用的图像格式提供了高性能、GPU加速的JPEG解码功能。该库提供单个和批处理JPEG解码功能,可有效利用可用GPU资源实现最佳性能;以及用户管理内存分配的灵活性需要解码。

NvJpeg编码

在这里插入图片描述

#include "nvjpeg_coder.h"

#include "logger.h"
#include <cstdint>
#include <string>


NvJpegCoder::NvJpegCoder(size_t width, size_t height) :
    image_width_(width),
    image_height_(height)
{
    
}

NvJpegCoder::~NvJpegCoder()
{

}

int device_malloc(void **p, size_t s) 
{ 
    return (int)cudaMalloc(p, s); 
}

int device_free(void *p) 
{
    return (int)cudaFree(p); 
}

/**
 * @brief 
 * 
 * @param format 
 * @return int 
 */
int NvJpegCoder::initialize(const input_pixel_format format)
{
    cudaDeviceProp props;

    input_pixfmt_ = format;
    // cuda event create
#ifdef ELAPSEDTIME
    CHECK_CUDA(cudaEventCreate(&start_event_));
    CHECK_CUDA(cudaEventCreate(&stop_event_));
#endif
    // cuda buffer malloc
    if (format == RGBI)
    {
        cuda_ebcoder_buffer_size_ = image_width_ * image_height_ * 3;
    } else {
        LOG_ERROR("invalid input pixel forat:%d\n", format);
        return -1;
    }
    CHECK_CUDA(cudaMalloc((void**)&cuda_encoder_buffer_ptr_, cuda_ebcoder_buffer_size_));

    // nvjpeg create and initialize
    nvjpegDevAllocator_t dev_allocator = {&device_malloc, &device_free};
    CHECK_NVJPEG(nvjpegCreate(NVJPEG_BACKEND_DEFAULT, &dev_allocator, &nvjpeg_handle_));
    CHECK_NVJPEG(nvjpegJpegStateCreate(nvjpeg_handle_, &jpeg_state_));
    CHECK_NVJPEG(nvjpegEncoderStateCreate(nvjpeg_handle_, &encoder_state_, NULL));
    CHECK_NVJPEG(nvjpegEncoderParamsCreate(nvjpeg_handle_, &encoder_params_, NULL));
    
    // get device 
    cudaGetDeviceProperties(&props, 0);

    // config input parameters
	nvjpegEncoderParamsSetEncoding(encoder_params_, 
        nvjpegJpegEncoding_t::NVJPEG_ENCODING_PROGRESSIVE_DCT_HUFFMAN, NULL);
	nvjpegEncoderParamsSetOptimizedHuffman(encoder_params_, 1, NULL);
	nvjpegEncoderParamsSetQuality(encoder_params_, 100, NULL);
    if (format == RGBI)
    {
        nvjpegEncoderParamsSetSamplingFactors(encoder_params_, 
            nvjpegChromaSubsampling_t::NVJPEG_CSS_444, NULL);
    } else {
        LOG_ERROR("invalid input pixel forat:%d\n", format);
        return -1;
    }

    return 0;
}

/**
 * @brief encode raw image to jpeg format
 * 
 * @param input        : raw image data
 * @param input_len    : raw image data len
 * @param width        : raw image width
 * @param height       : raw image height
 * @param output       : jpeg data(notice, this point must free after no used)
 * @param output_len   : jpeg data len
 * @return int         : 
            0: success
            other: failed
 */
int NvJpegCoder::encode(uint8_t *input, size_t input_len, size_t width, 
    size_t height, uint8_t **output, size_t &output_len)
{
    nvjpegImage_t imgdesc;
    nvjpegInputFormat_t input_format;
#ifdef ELAPSEDTIME
    CHECK_CUDA(cudaEventRecord(start_event_));
#endif
    // copy host data buffer to deivce data buffer
    CHECK_CUDA(cudaMemcpy(cuda_encoder_buffer_ptr_, input, input_len, cudaMemcpyHostToDevice));

    if (input_pixfmt_ == RGBI)
    {
        imgdesc = 
        {
            {
                cuda_encoder_buffer_ptr_
            },
            {
                (unsigned int)width*3
            }
        };

        input_format = NVJPEG_INPUT_RGBI;

        CHECK_NVJPEG(nvjpegEncodeImage(nvjpeg_handle_,
                    encoder_state_,
                    encoder_params_,
                    &imgdesc,
                    input_format,
                    width,
                    height,
                    NULL));
    } else {
        LOG_ERROR("invalid input pixel format:%d", input_pixfmt_);
        return -1;
    }

    // std::vector<unsigned char> obuffer;
    size_t length = 0;
    CHECK_NVJPEG(nvjpegEncodeRetrieveBitstream(
                nvjpeg_handle_,
                encoder_state_,
                NULL,
                &length,
                NULL));

    // obuffer.resize(length);
    *output = new uint8_t[length];
    output_len = length;
    CHECK_NVJPEG(nvjpegEncodeRetrieveBitstream(
                nvjpeg_handle_,
                encoder_state_,
                *output,
                &length,
                NULL));
    // static int count = 0;
    // std::cout << "Writing JPEG file: sample.jpg"  << std::endl;
    // std::ofstream outputFile("sample" + std::to_string(count++) +  ".jpg", std::ios::out | std::ios::binary);
    // outputFile.write(reinterpret_cast<const char *>(obuffer.data()), static_cast<int>(length));

#ifdef ELAPSEDTIME
    float cost_time_ms = 0.0;
    CHECK_CUDA(cudaEventRecord(stop_event_));
    CHECK_CUDA(cudaEventSynchronize(stop_event_));
    /*CHECK_CUDA*/(cudaEventElapsedTime(&cost_time_ms, start_event_, stop_event_));
    LOG_INFO("encode image cost time:%f ms", cost_time_ms);
#endif

    return 0;
}

int NvJpegCoder::deinitialize()
{
    cudaFree(cuda_encoder_buffer_ptr_);

    cudaEventDestroy(start_event_);
    cudaEventDestroy(stop_event_);

    CHECK_NVJPEG(nvjpegEncoderParamsDestroy(encoder_params_));
    CHECK_NVJPEG(nvjpegEncoderStateDestroy(encoder_state_));
    CHECK_NVJPEG(nvjpegJpegStateDestroy(jpeg_state_));
    CHECK_NVJPEG(nvjpegDestroy(nvjpeg_handle_));
}

NvJpeg解码


int decode_images(const FileData &img_data, const std::vector<size_t> &img_len,
                  std::vector<nvjpegImage_t> &out, decode_params_t &params,
                  double &time) {
  CHECK_CUDA(cudaStreamSynchronize(params.stream));
  cudaEvent_t startEvent = NULL, stopEvent = NULL;
  float loopTime = 0; 
  
  CHECK_CUDA(cudaEventCreate(&startEvent, cudaEventBlockingSync));
  CHECK_CUDA(cudaEventCreate(&stopEvent, cudaEventBlockingSync));


  std::vector<const unsigned char*> batched_bitstreams;
  std::vector<size_t> batched_bitstreams_size;
  std::vector<nvjpegImage_t>  batched_output;

  // bit-streams that batched decode cannot handle
  std::vector<const unsigned char*> otherdecode_bitstreams;
  std::vector<size_t> otherdecode_bitstreams_size;
  std::vector<nvjpegImage_t> otherdecode_output;

  if(params.hw_decode_available){
    for(int i = 0; i < params.batch_size; i++){
      // extract bitstream meta data to figure out whether a bit-stream can be decoded
      nvjpegJpegStreamParseHeader(params.nvjpeg_handle, (const unsigned char *)img_data[i].data(), img_len[i], params.jpeg_streams[0]);
      int isSupported = -1;
      nvjpegDecodeBatchedSupported(params.nvjpeg_handle, params.jpeg_streams[0], &isSupported);

      if(isSupported == 0){
        batched_bitstreams.push_back((const unsigned char *)img_data[i].data());
        batched_bitstreams_size.push_back(img_len[i]);
        batched_output.push_back(out[i]);
      } else {
        otherdecode_bitstreams.push_back((const unsigned char *)img_data[i].data());
        otherdecode_bitstreams_size.push_back(img_len[i]);
        otherdecode_output.push_back(out[i]);
      }
    }
  } else {
    for(int i = 0; i < params.batch_size; i++) {
      otherdecode_bitstreams.push_back((const unsigned char *)img_data[i].data());
      otherdecode_bitstreams_size.push_back(img_len[i]);
      otherdecode_output.push_back(out[i]);
    }
  }

  CHECK_CUDA(cudaEventRecord(startEvent, params.stream));

    if(batched_bitstreams.size() > 0)
     {
          CHECK_NVJPEG(
               nvjpegDecodeBatchedInitialize(params.nvjpeg_handle, params.nvjpeg_state,
                                            batched_bitstreams.size(), 1, params.fmt));

         CHECK_NVJPEG(nvjpegDecodeBatched(
             params.nvjpeg_handle, params.nvjpeg_state, batched_bitstreams.data(),
             batched_bitstreams_size.data(), batched_output.data(), params.stream));
     }

    if(otherdecode_bitstreams.size() > 0)
    {
          CHECK_NVJPEG(nvjpegStateAttachDeviceBuffer(params.nvjpeg_decoupled_state, params.device_buffer));
          int buffer_index = 0;
          CHECK_NVJPEG(nvjpegDecodeParamsSetOutputFormat(params.nvjpeg_decode_params, params.fmt));
          for (int i = 0; i < params.batch_size; i++) {
              CHECK_NVJPEG(
                  nvjpegJpegStreamParse(params.nvjpeg_handle, otherdecode_bitstreams[i], otherdecode_bitstreams_size[i],
                  0, 0, params.jpeg_streams[buffer_index]));

              CHECK_NVJPEG(nvjpegStateAttachPinnedBuffer(params.nvjpeg_decoupled_state,
                  params.pinned_buffers[buffer_index]));

              CHECK_NVJPEG(nvjpegDecodeJpegHost(params.nvjpeg_handle, params.nvjpeg_decoder, params.nvjpeg_decoupled_state,
                  params.nvjpeg_decode_params, params.jpeg_streams[buffer_index]));

              CHECK_CUDA(cudaStreamSynchronize(params.stream));

              CHECK_NVJPEG(nvjpegDecodeJpegTransferToDevice(params.nvjpeg_handle, params.nvjpeg_decoder, params.nvjpeg_decoupled_state,
                  params.jpeg_streams[buffer_index], params.stream));

              buffer_index = 1 - buffer_index; // switch pinned buffer in pipeline mode to avoid an extra sync

              CHECK_NVJPEG(nvjpegDecodeJpegDevice(params.nvjpeg_handle, params.nvjpeg_decoder, params.nvjpeg_decoupled_state,
                  &otherdecode_output[i], params.stream));

          }
    }
  CHECK_CUDA(cudaEventRecord(stopEvent, params.stream));

  CHECK_CUDA(cudaEventSynchronize(stopEvent));
  CHECK_CUDA(cudaEventElapsedTime(&loopTime, startEvent, stopEvent));
  time = 0.001 * static_cast<double>(loopTime); // cudaEventElapsedTime returns milliseconds

  return EXIT_SUCCESS;
}

int write_images(std::vector<nvjpegImage_t> &iout, std::vector<int> &widths,
                 std::vector<int> &heights, decode_params_t &params,
                 FileNames &filenames) {
  for (int i = 0; i < params.batch_size; i++) {
    // Get the file name, without extension.
    // This will be used to rename the output file.
    size_t position = filenames[i].rfind("/");
    std::string sFileName =
        (std::string::npos == position)
            ? filenames[i]
            : filenames[i].substr(position + 1, filenames[i].size());
    position = sFileName.rfind(".");
    sFileName = (std::string::npos == position) ? sFileName
                                                : sFileName.substr(0, position);
    std::string fname(params.output_dir + "/" + sFileName + ".bmp");

    int err;
    if (params.fmt == NVJPEG_OUTPUT_RGB || params.fmt == NVJPEG_OUTPUT_BGR) {
      err = writeBMP(fname.c_str(), iout[i].channel[0], iout[i].pitch[0],
                     iout[i].channel[1], iout[i].pitch[1], iout[i].channel[2],
                     iout[i].pitch[2], widths[i], heights[i]);
    } else if (params.fmt == NVJPEG_OUTPUT_RGBI ||
               params.fmt == NVJPEG_OUTPUT_BGRI) {
      // Write BMP from interleaved data
      err = writeBMPi(fname.c_str(), iout[i].channel[0], iout[i].pitch[0],
                      widths[i], heights[i]);
    }
    if (err) {
      std::cout << "Cannot write output file: " << fname << std::endl;
      return EXIT_FAILURE;
    }
    std::cout << "Done writing decoded image to file: " << fname << std::endl;
  }
  return EXIT_SUCCESS;
}

double process_images(FileNames &image_names, decode_params_t &params,
                      double &total) {
  // vector for storing raw files and file lengths
  FileData file_data(params.batch_size);
  std::vector<size_t> file_len(params.batch_size);
  FileNames current_names(params.batch_size);
  std::vector<int> widths(params.batch_size);
  std::vector<int> heights(params.batch_size);
  // we wrap over image files to process total_images of files
  FileNames::iterator file_iter = image_names.begin();

  // stream for decoding
  CHECK_CUDA(
      cudaStreamCreateWithFlags(&params.stream, cudaStreamNonBlocking));

  int total_processed = 0;

  // output buffers
  std::vector<nvjpegImage_t> iout(params.batch_size);
  // output buffer sizes, for convenience
  std::vector<nvjpegImage_t> isz(params.batch_size);

  for (int i = 0; i < iout.size(); i++) {
    for (int c = 0; c < NVJPEG_MAX_COMPONENT; c++) {
      iout[i].channel[c] = NULL;
      iout[i].pitch[c] = 0;
      isz[i].pitch[c] = 0;
    }
  }

  double test_time = 0;
  int warmup = 0;
  while (total_processed < params.total_images) {
    if (read_next_batch(image_names, params.batch_size, file_iter, file_data,
                        file_len, current_names))
      return EXIT_FAILURE;

    if (prepare_buffers(file_data, file_len, widths, heights, iout, isz,
                        current_names, params))
      return EXIT_FAILURE;

    double time;
    if (decode_images(file_data, file_len, iout, params, time))
      return EXIT_FAILURE;
    if (warmup < params.warmup) {
      warmup++;
    } else {
      total_processed += params.batch_size;
      test_time += time;
    }

    if (params.write_decoded)
      write_images(iout, widths, heights, params, current_names);
  }
  total = test_time;

  release_buffers(iout);

  CHECK_CUDA(cudaStreamDestroy(params.stream));

  return EXIT_SUCCESS;
}

int main(int argc, const char *argv[]) {
  int pidx;

  if ((pidx = findParamIndex(argv, argc, "-h")) != -1 ||
      (pidx = findParamIndex(argv, argc, "--help")) != -1) {
    std::cout << "Usage: " << argv[0]
              << " -i images_dir [-b batch_size] [-t total_images] "
                 "[-w warmup_iterations] [-o output_dir] "
                 "[-pipelined] [-batched] [-fmt output_format]\n";
    std::cout << "Parameters: " << std::endl;
    std::cout << "\timages_dir\t:\tPath to single image or directory of images"
              << std::endl;
    std::cout << "\tbatch_size\t:\tDecode images from input by batches of "
                 "specified size"
              << std::endl;
    std::cout << "\ttotal_images\t:\tDecode this much images, if there are "
                 "less images \n"
              << "\t\t\t\t\tin the input than total images, decoder will loop "
                 "over the input"
              << std::endl;
    std::cout << "\twarmup_iterations\t:\tRun this amount of batches first "
                 "without measuring performance"
              << std::endl;
    std::cout
        << "\toutput_dir\t:\tWrite decoded images as BMPs to this directory"
        << std::endl;
    std::cout << "\tpipelined\t:\tUse decoding in phases" << std::endl;
    std::cout << "\tbatched\t\t:\tUse batched interface" << std::endl;
    std::cout << "\toutput_format\t:\tnvJPEG output format for decoding. One "
                 "of [rgb, rgbi, bgr, bgri, yuv, y, unchanged]"
              << std::endl;
    return EXIT_SUCCESS;
  }

  decode_params_t params;

  params.input_dir = "./";
  if ((pidx = findParamIndex(argv, argc, "-i")) != -1) {
    params.input_dir = argv[pidx + 1];
  } else {
    // Search in default paths for input images.
     int found = getInputDir(params.input_dir, argv[0]);
    if (!found)
    {
      std::cout << "Please specify input directory with encoded images"<< std::endl;
      return EXIT_FAILURE;
    }
  }

  params.batch_size = 1;
  if ((pidx = findParamIndex(argv, argc, "-b")) != -1) {
    params.batch_size = std::atoi(argv[pidx + 1]);
  }

  params.total_images = -1;
  if ((pidx = findParamIndex(argv, argc, "-t")) != -1) {
    params.total_images = std::atoi(argv[pidx + 1]);
  }

  params.warmup = 0;
  if ((pidx = findParamIndex(argv, argc, "-w")) != -1) {
    params.warmup = std::atoi(argv[pidx + 1]);
  }

  params.fmt = NVJPEG_OUTPUT_RGB;
  if ((pidx = findParamIndex(argv, argc, "-fmt")) != -1) {
    std::string sfmt = argv[pidx + 1];
    if (sfmt == "rgb")
      params.fmt = NVJPEG_OUTPUT_RGB;
    else if (sfmt == "bgr")
      params.fmt = NVJPEG_OUTPUT_BGR;
    else if (sfmt == "rgbi")
      params.fmt = NVJPEG_OUTPUT_RGBI;
    else if (sfmt == "bgri")
      params.fmt = NVJPEG_OUTPUT_BGRI;
    else if (sfmt == "yuv")
      params.fmt = NVJPEG_OUTPUT_YUV;
    else if (sfmt == "y")
      params.fmt = NVJPEG_OUTPUT_Y;
    else if (sfmt == "unchanged")
      params.fmt = NVJPEG_OUTPUT_UNCHANGED;
    else {
      std::cout << "Unknown format: " << sfmt << std::endl;
      return EXIT_FAILURE;
    }
  }

  params.write_decoded = false;
  if ((pidx = findParamIndex(argv, argc, "-o")) != -1) {
    params.output_dir = argv[pidx + 1];
    if (params.fmt != NVJPEG_OUTPUT_RGB && params.fmt != NVJPEG_OUTPUT_BGR &&
        params.fmt != NVJPEG_OUTPUT_RGBI && params.fmt != NVJPEG_OUTPUT_BGRI) {
      std::cout << "We can write ony BMPs, which require output format be "
                   "either RGB/BGR or RGBi/BGRi"
                << std::endl;
      return EXIT_FAILURE;
    }
    params.write_decoded = true;
  }

  nvjpegDevAllocator_t dev_allocator = {&dev_malloc, &dev_free};
  nvjpegPinnedAllocator_t pinned_allocator ={&host_malloc, &host_free};

  nvjpegStatus_t status = nvjpegCreateEx(NVJPEG_BACKEND_HARDWARE, &dev_allocator,
                                &pinned_allocator,NVJPEG_FLAGS_DEFAULT,  &params.nvjpeg_handle);
  params.hw_decode_available = true;
  if( status == NVJPEG_STATUS_ARCH_MISMATCH) {
    std::cout<<"Hardware Decoder not supported. Falling back to default backend"<<std::endl;
    CHECK_NVJPEG(nvjpegCreateEx(NVJPEG_BACKEND_DEFAULT, &dev_allocator,
                              &pinned_allocator, NVJPEG_FLAGS_DEFAULT, &params.nvjpeg_handle));
    params.hw_decode_available = false;
  } else {
    CHECK_NVJPEG(status);
  }

  CHECK_NVJPEG(
      nvjpegJpegStateCreate(params.nvjpeg_handle, &params.nvjpeg_state));



  create_decoupled_api_handles(params);

  // read source images
  FileNames image_names;
  readInput(params.input_dir, image_names);

  if (params.total_images == -1) {
    params.total_images = image_names.size();
  } else if (params.total_images % params.batch_size) {
    params.total_images =
        ((params.total_images) / params.batch_size) * params.batch_size;
    std::cout << "Changing total_images number to " << params.total_images
              << " to be multiple of batch_size - " << params.batch_size
              << std::endl;
  }

  std::cout << "Decoding images in directory: " << params.input_dir
            << ", total " << params.total_images << ", batchsize "
            << params.batch_size << std::endl;

  double total;
  if (process_images(image_names, params, total)) return EXIT_FAILURE;
  std::cout << "Total decoding time: " << total << " (s)" << std::endl;
  std::cout << "Avg decoding time per image: " << total / params.total_images 
            << " (s)" << std::endl;
  std::cout << "Avg images per sec: " << params.total_images / total
            << std::endl;
  std::cout << "Avg decoding time per batch: "
            << total / ((params.total_images + params.batch_size - 1) /
                        params.batch_size) 
            << " (s)" << std::endl;

  destroy_decoupled_api_handles(params);

  CHECK_NVJPEG(nvjpegJpegStateDestroy(params.nvjpeg_state));
  CHECK_NVJPEG(nvjpegDestroy(params.nvjpeg_handle));

  return EXIT_SUCCESS;
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

基于nvJpeg编解码图片 的相关文章

  • 构建 Erlang 服务器场(用于业余爱好项目)最便宜的方法是什么? [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 假设我们有一个 本质上并行 的问题需要用 Erlang 软件来解决 我们有很多并行进程 每个进程都执行顺序代码 不是数字运算 并且我们向它们投入的 C
  • CUDA错误:在python中使用并行时初始化错误

    我的代码使用 CUDA 但运行速度仍然很慢 因此 我将其更改为使用 python 中的多处理 pool map 并行运行 但我有CUDA ERROR initialization error 这是函数 def step M self ite
  • 如何在 CUDA 应用程序中构建数据以获得最佳速度

    我正在尝试编写一个简单的粒子系统 利用 CUDA 来更新粒子位置 现在 我定义的粒子有一个对象 该对象的位置由三个浮点值定义 速度也由三个浮点值定义 更新粒子时 我向速度的 Y 分量添加一个常量值以模拟重力 然后将速度添加到当前位置以得出新
  • libstdc++.so.6 与 cuda 相关的链接器问题

    今天我在链接我编译的 cuda 内容时遇到了问题 我有一个最新的 debian 测试 w 2 6 32 3 amd64 我整天都在写我的代码 不时编译 没有问题 但在进行了较小的代码更改后 我收到以下错误 gcc o pa CUDA o h
  • Cuda Bayer/CFA 去马赛克示例

    我编写了一个 CUDA4 Bayer 去马赛克例程 但它比在 16 核 GTS250 上运行的单线程 CPU 代码慢 块大小是 16 16 图像暗淡是 16 的倍数 但更改此值并不会改善它 我做了什么明显愚蠢的事情吗 calling rou
  • 为什么 gcc 和 NVCC (g++) 会看到两种不同的结构大小?

    我正在尝试将 CUDA 添加到 90 年代末编写的现有单线程 C 程序中 为此 我需要混合两种语言 C 和 C nvcc 是 c 编译器 问题在于 C 编译器将结构视为特定大小 而 C 编译器将相同的结构视为略有不同的大小 那很糟 我对此感
  • 在linux上编译一个基本的OpenCV + Cuda程序

    我过去在linux上使用过opencv 但没有使用过cuda 几个月来我一直在与以下编译错误作斗争 在尝试了许多解决方案后 我放弃并使用 Windows 不过 我真的很想在 Linux 上工作 这是我用来编译 opencv gpu 网站上给
  • 如何在 Visual Studio 2010 中设置 CUDA 编译器标志?

    经过坚持不懈的得到error identifier atomicAdd is undefined 我找到了编译的解决方案 arch sm 20旗帜 但是如何在 VS 2010 中传递这个编译器标志呢 我已经尝试过如下Project gt P
  • 仅使用 CUDA 进行奇异值计算

    我正在尝试使用新的cusolverDnSgesvdCUDA 7 0 用于计算奇异值的例程 完整代码如下 include cuda runtime h include device launch parameters h include
  • 如何确定完整的 CUDA 版本 + 颠覆版本?

    Linux 上的 CUDA 发行版曾经有一个名为version txt例如 CUDA Version 10 2 89 这非常有用 但是 从 CUDA 11 1 开始 该文件不再存在 我如何在 Linux 上通过命令行确定并检查 path t
  • 运行时 API 应用程序中的 cuda 上下文创建和资源关联

    我想了解如何在 cuda 运行时 API 应用程序中创建 cuda 上下文并与内核关联 我知道这是由驱动程序 API 在幕后完成的 但我想了解一下创作的时间线 首先 我知道 cudaRegisterFatBinary 是第一个 cuda a
  • CUDA线程执行顺序

    我有一个 CUDA 程序的以下代码 include
  • 设置最大 CUDA 资源

    我想知道是否可以设置 CUDA 应用程序的最大 GPU 资源 例如 如果我有一个 4GB GPU 但希望给定的应用程序只能访问 2GB 如果它尝试分配更多 就会失败 理想情况下 这可以在进程级别或 CUDA 上下文级别上设置 不 目前没有允
  • CUDA 常量内存是否应该被均匀地访问?

    我的 CUDA 应用程序的恒定内存小于 8KB 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 如果是 如何确保所有线程同时访问同一地址 既然它都会被缓存 我是否需要担心每个线程访问相同的地址以进行优化 是的 这缓存本身每
  • Yocto for Nvidia Jetson 由于 GCC 7 而失败 - 无法计算目标文件的后缀

    我正在尝试将 Yocto 与 meta tegra 一起使用 https github com madisongh meta tegra https github com madisongh meta tegra 为 Nvidia Jets
  • 有没有一种有效的方法来优化我的序列化代码?

    这个问题缺乏细节 因此 我决定创建另一个问题而不是编辑这个问题 新问题在这里 我可以并行化我的代码吗 还是不值得 https stackoverflow com questions 17937438 can i parallelize my
  • __device__ __constant__ 常量

    有什么区别吗 在 CUDA 程序中定义设备常量的最佳方法是什么 在 C 主机 设备程序中 如果我想将常量定义在设备常量内存中 我可以这样做 device constant float a 5 constant float a 5 问题 1
  • CUDA、NPP 滤波器

    CUDA NPP 库支持使用 nppiFilter 8u C1R 命令过滤图像 但不断出现错误 我可以毫无问题地启动并运行 boxFilterNPP 示例代码 eStatusNPP nppiFilterBox 8u C1R oDeviceS
  • CUDA - 将 CPU 变量传输到 GPU __constant__ 变量

    与 CUDA 的任何事情一样 最基本的事情有时也是最难的 所以 我只想将变量从 CPU 复制到 GPUconstant变量 我很难过 这就是我所拥有的 constant int contadorlinhasx d int main int
  • 最小化 MC 模拟期间存储的 cuRAND 状态数量

    我目前正在 CUDA 中编写蒙特卡罗模拟 因此 我需要生成lots使用随机数cuRAND图书馆 每个线程处理一个巨大的元素floatarray 示例中省略 并在每次内核调用时生成 1 或 2 个随机数 通常的方法 参见下面的示例 似乎是为每

随机推荐

  • 关于nmealib库的学习

    调用流程 前部分的调用流程如下 nmea parse gt nmea parser push parser buff buff sz gt nparsed nmea parser real push parser buff nparse g
  • [HLS]HTTP Live Streaming流与TS流比较

    转自 http www cuplayer com player PlayerCode FMS 2013 0725 905 4 html 你说的应该是 HTTP Live Streaming 1 吧 这个是 Apple 为了提高流播效率开发的
  • 面向对象编程及其三大特征(JAVA)

    面向对象编程及其三大特征 JAVA 一 面向对象编程介绍 面向过程与面向对象 面向对象的本质 二 面向对象编程的三大特征 封装 封装的概念 封装的优点 封装举例 Person类 继承 继承的概念 继承的优点 继承类型 继承注意事项 继承举例
  • 【2023B题】人工智能对大学生学习影响的评价(思路、代码)

    目录 1 概述 2 Matlab代码实现 3 参考文献 4 运行结果 1 概述 人工智能简称AI 最初由麦卡锡 明斯基等科学家于1956年在美国达特茅斯学院开会研讨时提出 2016年 人工智能AlphaGo 4 1战胜韩国围棋高手李世石 期
  • MATLAB人脸检测算法

    MATLAB人脸检测算法 人脸检测是将人脸从复杂的背景图像中检测出来 它是实现人脸识别的基础和前提 肤色重建 使用人脸肤色模板对灰度图像进行肤色重建 使其变成彩色图像 效果如下 在函数function R gray2rgb1 img1 im
  • Qt 程序获取各种文件路径方法

    Qt 程序获取程序所在路径 用户目录路径 临时文件夹等特殊路径的方法 经常我们的程序中需要访问一些特殊的路径 比如程序所在的路径 用户目录路径 临时文件夹等 在 Qt 中实现这几个功能所用的方法虽然都不难 但是各不相同 每次用到时还要现去查
  • 20张原版Python科学速查表,数据分析不再是难题

    1 Python基础 2 Pandas基础 3 Numpy基础 4 PySpark基础 5 数组排序算法 6 scikit learn算法小抄 内容就不给大家一一自行领取哦
  • 编译UNP源码

    读UNP需要用到官方的源码 记录一下折腾的记录 源码下载地址 http www unpbook com 下载源码后 解压出文件夹unpv13e cd进入后 依次进行下面操作 configure cd lib make 这两步没有问题 出现w
  • 程序内执行shell命令自动获取局域网内所有在线IP和开放端口(Linux)

    前言 题目说的有点长 其实就是以下几件事 第一是让Shell命令可以在程序内执行 然后将执行结果传递给变量 从而可以进行后续的事务处理 第二是使用nmap命令获取当前局域网内所有在线IP和开放的端口 最后就是对nmap获得的结果进行处理 得
  • Nexus因异常重启导致OrientDB数据库变为只读的问题修复

    文章目录 环境 问题描述 问题排查 解决步骤 环境 CentOS 7 6 Nexus 3 21 2 问题描述 装有Nexus的服务机在异常故障重启后 Nexus可以正常读取和拉取jar包 但尝试上传时报错 打开Nexus服务器上的日志文件发
  • 机器学习PCA——实验报告

    机器学习实验报告 实验报告pdf可在该网址下载 一 实验目的与要求 二 实验内容与方法 2 0 PCA算法学习与回顾 2 0 1 PCA推导的优化问题 2 0 2 优化问题的解 2 0 3 算法流程 2 1 人脸数据集 2 2 实验流程图
  • Qt—QPainter基本图形绘制详解

    QPainter描述 1 QPainter 类在小部件和其他绘制设备上执行低级绘制 2 QPainter 提供了高度优化的功能来完成大多数图形GUI程序所需的工作 它可以画从简单的线条到复杂的形状 它还可以绘制对齐的文本和像素图 QPain
  • sideeffects没配置css也还在,webpack4踩坑配置之sideEffects, 打包文件中没有css文件

    最开始先来讲一下sideEffects sideEffects sideEffects意为副作用 无副作用类似纯函数的概念 接受参数并返回值 不产生其他影响 这里的副作用针对模块 如果一个模块单纯的导入导出变量那就是无副作用的 如果还修改其
  • docker从安装到部署一个项目

    一 centos安装docker 参考博客 https blog csdn net m0 47010003 article details 127775185 1 设置一下下载Docker的镜像源 设置下载的镜像源为国内的阿里云 如果不设置
  • sqlilabs第五关

    文章目录 前言 一 二次注入 二 别的方法 三 sqlmap 前言 本来这篇博客前几天就准备写 奈何因为各种原因拖到了现在 然后参加ctf又白给 不说了 都是泪 流眼泪 jpg 如有错误希望各位师傅指正 拜托 jpg 一 二次注入 本次采用
  • iOS一键生成所有图标

    记录一个iOS开发一键生成图标的网站 https icon wuruihong com
  • CUDA性能优化系列——Kmeans算法调优(二)

    本篇介绍Kmeans算法中计算新的聚类中心部分 这部分主要逻辑 根据计算出的新的分类信息 对全部数据点依次对每个类别求出所属当前类别的数据点个数与坐标和 本质上就是进行规约运算 V1 Atomic实现全局规约 由于最终生成16个聚类中心 因
  • k-均值聚类Python代码实现

    k 均值聚类的简介可以参考 http blog csdn net fengbingchun article details 79276668 这里给出两种方式的k 均值实现 code主要来自于网络 1 以下code来自于 https mub
  • TensorFlow、PyTorch分布式训练

    要在两台主机之间使用分布式训练 您可以使用一些深度学习框架提供的工具和库来实现 这里以TensorFlow为例 介绍一下如何在两台主机之间使用分布式训练 首先 您需要安装TensorFlow和CUDA等相关软件 并确保两台主机都可以访问彼此
  • 基于nvJpeg编解码图片

    NvJpeg介绍 nvJPEG库为深度学习和超大规模多媒体应用程序中常用的图像格式提供了高性能 GPU加速的JPEG解码功能 该库提供单个和批处理JPEG解码功能 可有效利用可用GPU资源实现最佳性能 以及用户管理内存分配的灵活性需要解码