限制fwrite操作的CPU使用率

时间:2016-02-18 10:36:49

标签: c++ multithreading cpu-usage fwrite

我正在开发一个程序,其中有多个线程可以管理来自多个摄像头的流媒体。我必须在SSD磁盘上写每个原始图像。我正在使用fwrite将图像放入二进制文件中。类似的东西:

FILE* output;
output = fopen(fileName, "wb");
fwrite(imageData, imageSize, 1, output);
fclose(output);

该程序似乎运行得足够快,可以使用给定的摄像机吞吐量保存所有图像。问题是保存过程是CPU消耗的,并且由于保存线程的CPU使用率,在启用保存过程时我开始出现同步问题。

有没有办法减少fwrite操作的CPU负载?就像玩缓冲,更好的DMA设置,......?

谢谢!

MIX

- 更新1

忘记多线程软件,这是一个简单的文件编写软件:

#include <stdio.h>
#include <stdlib.h>

const unsigned int TOT_DATA = 1280*2*960;

int main(int argc, char* argv[])
{
  if(argc != 2)
  {
    printf("Usage:\n");
    printf("  %s totWrite\n\n", argv[0]);
    return -1;
  }

  char* imageData;
  FILE* output;
  char fileName[256];
  unsigned int totWrite;

  totWrite = atoi(argv[1]);
  imageData = new char[TOT_DATA];

  printf("Write imageData[%u] on file %u times.\n", TOT_DATA, totWrite);
  for(unsigned int i = 0; i < totWrite; i++)
  {
    sprintf(fileName, "image_%06u.raw", i);
    output = fopen(fileName, "wb");
    fwrite(imageData, TOT_DATA, 1, output);
    fclose(output);
  }
  printf("DONE!\n");  

  delete [] imageData;

  return 0;
}

将创建一个char缓冲区,它将在文件totWrite上写入。没有覆盖,因为每个循环都在新文件上写入。 (当然,必须删除之前运行的文件...)

在程序运行时运行top(我在Linux上)我看到使用了~50%的CPU(这意味着4个内核中有一个的50%)。我认为fwrite是关于CPU使用率的瓶颈,因为它是循环中的“较慢”操作,因此当top更新其统计信息时,“更可能”运行。如果TOT_DATA增加,例如100次,即使是“更有可能”。

有关什么可以减少此类程序中CPU使用率的进一步考虑?

1 个答案:

答案 0 :(得分:0)

如果您考虑使用DMA设置,那么您将超出标准C库的范围。它将无处可移植 - 然后您无法使用便携式功能。

您可能应该使用的第一步(在您确认其CPU是瓶颈之后)是使用较低级别的函数,例如open / write(或者您的操作系统调用的任何内容)它们)。

基本上fwrite会发生的事情是,在将数据实际写入光盘之前,程序首先将数据复制到内存中的另一个位置(FILE*缓冲区)。这个操作肯定是CPU限制的,如果CPU的数据传输速度比传输到SSD的数据慢,那么可能是没有充分理由消耗CPU功率的情况。

还应该注意使用多线程有它的缺点。首先,如果它不是SSD多线程写入磁盘可能导致冗余磁头移动,这也不错,但即使SSD可能会受到一些影响,因为您可能会破坏数据的布局。

加载整个文件时也存在问题,就像您在示例中所做的那样,特别是如果您在多个线程中执行此操作。它将消耗大量内存(这可能导致需要交换)。如果可能,您应该在数据到达时将数据写入文件。