Как установить openMP для многопоточности в Ubuntu 12.04 для проекта openCV?

0

Я хочу сделать многопоточность в одном из for loop #pragma omp parallel используя #pragma omp parallel. Итак, я пишу следующий код:

#pragma omp parallel for 
for(int i=0; i<square->total; i++)
{
......
}

Мой проект имеет CMakeList.txt и Makefile. Я не понимаю, как мне сказать компилятору и компоновщику использовать openMP?

Обновления:

Я редактировал мой CMakeList.txt со следующим кодом

find_package(OpenMP)
if (OPENMP_FOUND)
    set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} ${OpenMP_C_FLAGS}")
    set (CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${OpenMP_CXX_FLAGS}")
endif()

а затем я сделал cmake.. и получил следующий результат на терминале:

- Идентификатор компилятора C - это GNU

- Идентификатор компилятора CXX - это GNU

- Проверьте работу компилятора C: /usr/bin/gcc

- Проверьте работу компилятора C: /usr/bin/gcc - работает

- Обнаружение компилятора C

- Обнаружение компилятора C ABI info - done

- Проверьте работу компилятора CXX: /usr/bin/c++

- Проверить работоспособность компилятора CXX: /usr/bin/c++ - работает

- Обнаружение компилятора CXX ABI info

- Обнаружение компилятора CXX ABI info - done

- Попробуйте флаг OpenMP C = [-fopenmp]

- Выполнение теста OpenMP_FLAG_DETECTED

- Выполнение теста OpenMP_FLAG_DETECTED - Успех

- Попробуйте флаг OpenMP CXX = [-fopenmp]

- Выполнение теста OpenMP_FLAG_DETECTED

- Выполнение теста OpenMP_FLAG_DETECTED - Успех

- Найдено OpenMP: -fopenmp

- Настройка выполнена

- Создание готового

  • 1
    Вам не хватает одного for .
  • 0
    что "за" и где?
Показать ещё 3 комментария
Теги:
multithreading
gcc

2 ответа

0
Лучший ответ

@user2440724

Я написал образец кода, как вы спрашиваете:

#include <string>
#include <iostream>
#include <vector>
#include <omp.h>
using namespace std;
using namespace cv;
//----------------------------------------------------------
// MAIN
//----------------------------------------------------------
int main(int argc, char* argv[])
{
#ifdef _OPENMP 
#pragma omp parallel for
#endif
    for (int i = 0; i < 10; i++)
    {
      std::cout << "A" << std::endl;    
    }
    getchar();
    return 0;
}

в vs2010 вам нужно включить openmp, как показано ниже: Изображение 174551

Хороший учебник для Linux здесь: http://goulassoup.wordpress.com/2011/10/28/openmp-tutorial/ И GNU OpenMP docs: http://gcc.gnu.org/onlinedocs/libgomp/index.html#toc_Top

  • 0
    Привет, как я уже говорил, я использую Ubuntu. Я обновил свою проблему, пожалуйста, посмотрите на нее.
  • 0
    Я добавил ссылку на учебник для Linux (как уже упоминалось, он был протестирован для Ubuntu).
Показать ещё 6 комментариев
1

#pragma... должен быть в отдельной строке.

#pragma omp parallel for
for(int i=0; i<square->total; i++)
{
......
}

Убедитесь, что вы не забывайте, for в конце #pragma.

Сначала убедитесь, что он работает с #pragma строкой #pragma, затем добавление строки должно быть прекрасным (предполагая, что все внутри цикла в порядке, чтобы распараллелить, никаких проблем с параллелизмом или еще чего-то).

Также убедитесь, что вы передаете -fopenmp как компилятору, так и компоновщику, и у вас есть #include <omp.h> вверху.

  • 0
    спасибо ... как передать -fopenmp comlier и компоновщику? Мой проект , имеющий CMakeList.txt и Makefile ... после добавления строки , которые вы упомянули, я просто сделал make и побежал мою программу ... это не дает никакой ошибки , но не было никаких улучшений в comutational времени
  • 0
    я обновил свой вопрос еще несколькими шагами, которые я предпринял, чтобы использовать openMP.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню