Я немного изменил ваш код, чтобы использовать OpenMP для распараллеливания загрузки - фактические изменения минимальны - я просто поместил OpenMP pragma
перед циклом for
и сериализовал доступ к вектору изображений, поскольку векторы не являются потоковымиsafe.
#include <iostream>
#include <vector>
#include <mutex>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
void load_images(int start,int end){
vector<Mat>img_lst;
mutex mtx;
#pragma omp parallel for
for(size_t i=start;i<=end;i++){
char filename[16];
sprintf(filename,"%d.jpg",i);
Mat img = imread(filename);
if (img.empty()){
cerr << "ERROR: Failed to load " << filename << endl;
}
mtx.lock();
img_lst.push_back(img);
mtx.unlock();
}
mtx.lock();
cout << "INFO: Loaded " << img_lst.size() << endl;
mtx.unlock();
}
int
main(int argc,char*argv[])
{
load_images(1,122000);
}
Вы управляете количеством потоков, подобным этому:
export OMP_NUM_THREADS=2
time ./main
Время загрузки 122 000 изображений варьировалось в зависимости от количества потоков, которые я использовал в соответствии со следующей таблицей:
Threads Time (s)
================
1 44
2 23
4 12.4
8 8.8
Затем я решил, что, если вы делаете это достаточно часто, чтобы заботиться, вы, возможно, захотите заплатить небольшую цену заранее, чтобы еще больше улучшить время.Таким образом, вместо того, чтобы делать весь этот ресурсоемкий код для распаковки JPEG-файлов, вы можете преобразовать ваши изображения один раз в более простой для чтения формат, такой как PNM .Итак, я преобразовал все изображения JPEG в PNM, используя GNU Parallel , а затем вместо этого загрузил изображения PNM:
Так это выглядит так:
seq 122000 | parallel convert {}.jpg {}.pnm
И кодis:
...
...
#pragma omp parallel for
for(size_t i=start;i<=end;i++){
char filename[16];
sprintf(filename,"%d.pnm",i); <--- ONLY LINE CHANGED
Mat img = imread(filename);
...
...
И вы можете видеть, что времена значительно короче:
Nthreads Time(s)
================
1 7
2 4
4 2.5
8 3.2
Для компиляциис OpenMP используйте:
g++ -fopenmp =O3 -march native ...