Я смотрел на этот урок и часть маркировки смущает меня. Не саму маркировку, а то, как процесс показан в учебнике.
Более конкретно #pragma omp
разделы:
#pragma omp parallel for schedule(dynamic,3)
for(..loop a directory?..) {
...
#pragma omp critical
{
if(classes_training_data.count(class_) == 0) { //not yet created...
classes_training_data[class_].create(0,response_hist.cols,response_hist.type());
classes_names.push_back(class_);
}
classes_training_data[class_].push_back(response_hist);
}
total_samples++;
}
А также следующий код ниже.
Кто-нибудь может объяснить, что здесь происходит?
#pragma omp parallel for schedule(dynamic,3)
это сокращение, которое сочетает в себе несколько других прагм. Давайте посмотрим на них:
#pragma omp parallel
запускает блок parellel с набором потоков, которые будут выполнять следующую стадию параллельно.
Вы также можете указать «параллельные циклы», например for loop
: #pragma omp parallel for
, Эта прагма разделит цикл for между всеми потоками внутри параллельного блока, и каждый поток выполнит свою часть цикла.
Например:
#pragma omp parallel
{
#pragma omp for
for(int n(0); n < 5; ++n) {
std::cout << "Hello\n";
}
Это создаст параллельный блок, который будет выполнять цикл for. Нити будут печататься на стандартный вывод Hello
пять раз, в не указанном порядке (я имею в виду, что поток № 3 может напечатать свой «Hello» перед потоком № 1 и т. д.).
Теперь вы также можете запланировать, какой кусок работы получит каждый поток. Есть несколько политик: static
(по умолчанию) и dynamic
, Проверьте этот удивительный ответ в отношении политики планирования.
Теперь все эти прагмы можно сократить до одной:
#pragma omp parallel for schedule(dynamic,3)
который создаст параллельный блок, который будет выполнять цикл for, с динамическим планированием, и каждый поток в блоке выполнит 3 итерации цикла, прежде чем запрашивать у планировщика дополнительные порции.
critical
Прагма ограничит выполнение следующего блока одним потоком за раз. В вашем примере, только один поток за раз выполнит это:
{
if(classes_training_data.count(class_) == 0) { //not yet created...
classes_training_data[class_].create(0,response_hist.cols,response_hist.type());
classes_names.push_back(class_);
}
classes_training_data[class_].push_back(response_hist);
}
Вот у вас есть введение в OpenMP 3.0
,
Наконец, переменные, которые вы упоминаете, указаны в руководстве, просто посмотрите перед размещенным кодом:
vector<KeyPoint> keypoints;
Mat response_hist;
Mat img;
string filepath;
map<string,Mat> classes_training_data;
Ptr<FeatureDetector > detector(new SurfFeatureDetector());
Ptr<DescriptorMatcher > matcher(new BruteForceMatcher<L2<float> >());
Ptr<DescriptorExtractor > extractor(new OpponentColorDescriptorExtractor(Ptr<DescriptorExtractor>(new SurfDescriptorExtractor())));
Ptr<BOWImgDescriptorExtractor> bowide(new BOWImgDescriptorExtractor(extractor,matcher));
bowide->setVocabulary(vocabulary);