Я хочу сделать многопоточность в одном из 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
- Настройка выполнена
- Создание готового
@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, как показано ниже:
Хороший учебник для Linux здесь: http://goulassoup.wordpress.com/2011/10/28/openmp-tutorial/ И GNU OpenMP docs: http://gcc.gnu.org/onlinedocs/libgomp/index.html#toc_Top
#pragma...
должен быть в отдельной строке.
#pragma omp parallel for
for(int i=0; i<square->total; i++)
{
......
}
Убедитесь, что вы не забывайте, for
в конце #pragma
.
Сначала убедитесь, что он работает с #pragma
строкой #pragma
, затем добавление строки должно быть прекрасным (предполагая, что все внутри цикла в порядке, чтобы распараллелить, никаких проблем с параллелизмом или еще чего-то).
Также убедитесь, что вы передаете -fopenmp
как компилятору, так и компоновщику, и у вас есть #include <omp.h>
вверху.
-fopenmp
comlier и компоновщику? Мой проект , имеющий CMakeList.txt и Makefile ... после добавления строки , которые вы упомянули, я просто сделал make
и побежал мою программу ... это не дает никакой ошибки , но не было никаких улучшений в comutational времени
for
.