Быстрее Файл и запись в память - PullRequest
0 голосов
/ 02 июня 2019

У меня есть код, как определено ниже, но он занимает слишком много времени, я знаю, причина в том, что слишком много итераций, но есть ли решение, чтобы сделать этот цикл быстрым (каждый цикл должен читать число с плавающей точкой изфайл и запишите его в память) и там 15874861 цифр.

  float  SysMem;
  float fw;
  unsigned long  j;
   for (j = 0 ; j < 15874861 ; j++) 
    {
      fscanf(fp,"%f",&fw); // Read from file
      *((float *) (weights+j*0x04))  = fw; // Write to memory
      // Below lines are just to test, but even just read from file and writing is taking too long.
      SysMem= *((float *) (weights+j*0x04)); // Read back from memory
      if(fw != SysMem) 
         printf("Memory Error\n"); // If read back wrong flag a error
    }

Попытка сделать это быстрее

Ответы [ 3 ]

0 голосов
/ 02 июня 2019

Это может или не может иметь значение здесь, потому что I / O - самая медленная вещь, которая должна происходить здесь, но все эти преобразования не влияют на производительность и могут даже привести к ошибочному коду.Приведение говорит компилятору «я делаю здесь что-то странное», и это говорит компилятору не оптимизировать.

Например, на большинстве платформ размер float составляет 4 байта, ибыстрее назначить 4-байтовое значение по адресу, кратному 4, чем по произвольному адресу.Когда компилятор видит переменную типа float или массив float, он правильно выровняет эту переменную в памяти, чтобы иметь возможность использовать метод быстрого 4-байтового присваивания.Когда компилятор видит (float *) (weights+j*0x04), он не уверен, является ли он кратным 4, поэтому он может генерировать код, который обязательно скопирует то, что вы ожидаете, но медленнее, потому что он копирует отдельные байты один за другим.(Компилятору не нужно генерировать более медленный код: он может быть неприятным и предполагать, что weights правильно выровнен, и генерировать код, который не копирует то, что вы ожидаете, если weights не выровнен правильно.)

Тело цикла должно быть просто

fscanf(fp, "%f", weights[j]);

(Предполагая, что вы знаете, что входной файл правильно сформирован, в противном случае вам нужно добавить проверку ошибок.)

0 голосов
/ 08 июня 2019

Итак, вот что я сделал для маневрирования данных.

FILE *fp;
  fp = fopen("/media/card/kernel.txt", "r");
  n=0;
  //Read from the file. 
  while(fscanf(fp, "%f", &array[n++])!= EOF);
  // Copy the whole data to memory at the given address
  memcpy(weights, array, sizeof(array) );

// Read back first few and last few values back just to cross check on functionality.
    for (int j = 0 ; j < 10; j++) {
               SysMem= *((float *) (weights+j*0x04));
     printf("Read %f\n", SysMem);
    }

               for (int j = 15874861 ; j > 15874850; j--) {
               SysMem= *((float *) (weights+j*0x04));
     printf("Read %f\n", SysMem);
    }

Почему я это сделал?

2 Причины, я не запускаю это на обычной системе, это настраиваемая плата.Таким образом, я понял, что чтение / запись памяти требует больших затрат времени, а ввод-вывод тоже медленный.Поэтому я просто переместил данные с помощью memcpy.

Спасибо всем за помощь и предложения.

0 голосов
/ 02 июня 2019

Вы можете ускорить процесс, сопоставив файл с памятью (с помощью mmap , если вы используете Linux), и скомпилировав программу с самым высоким уровнем оптимизации (передав флаг -O3, есливы используете gcc / clang)

Кроме того, вместо того, чтобы читать по одному разу каждую итерацию (и не хотите использовать mmap), найдите способ прочитать большие куски с плавающей точкой за один шаг, а затем снова прочитать, когдавам нужно больше.

Вы также можете развернуть цикл немного, так как вы уже знаете количество нужных вам итераций (или вы можете позволить компилятору оптимизировать его с помощью флага -O3)

РЕДАКТИРОВАТЬ: не разверните цикл самостоятельно, но убедитесь, что компилятор делает все возможное, развернув его, используя соответствующий флаг

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...