Для школьного проекта мне нужно написать простой параллельный код на C++, научитесь использовать OpenMP. Поскольку это связано с изображениями, мне также нужно использовать библиотеку opencv.
Сначала я следовал этому руководству, чтобы вручную собрать библиотеку с помощью mingw, но у меня не получилось заставить ее работать, поэтому я использовал шоколадный скачать библиотеку и она работает без проблем, но только на компиляторе Visual Studio (cl.exe).
У меня нет проблем с последовательной версией, но однажды я перехожу на параллельную , поскольку мне нужно выполнить сокращение массива, я получаю следующую ошибку:
ошибка Переменная C3031 в предложении «сокращение» должна иметь скалярный арифметический тип
Насколько я понял, сокращение массива должно быть доступно в omp версии 4.5 и выше, но компилятор Visual Studio поддерживает только omp до 2.0
Для лучшего понимания это мой CMake
Код: Выделить всё
cmake_minimum_required(VERSION 3.29)
project(LocalBinaryPattern_omp)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} /openmp:experimental") #visualstudio
#set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fopenmp") #mingw
set(CMAKE_CXX_STANDARD 23)
set(ENV{OPENCV_DIR} "C:\\tools\\opencv\\build")
set(CMAKE_MODULE_PATH ${CMAKE_MODULE_PATH} "${CMAKE_SOURCE_DIR}/cmake/")
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_CURRENT_SOURCE_DIR})
find_package(OpenCV REQUIRED)
include_directories(${OpenCV_INCLUDE_DIRS})
find_package(OpenMP REQUIRED)
#target_link_libraries(LocalBinaryPattern_omp PRIVATE OpenMP::OpenMP_CXX)
add_executable(LocalBinaryPattern_omp main.cpp
LBP.cpp
)
set(OpenCV_LIBS opencv_core opencv_imgproc opencv_highgui opencv_imgcodecs)
target_link_libraries(LocalBinaryPattern_omp ${OpenCV_LIBS})
Код: Выделить всё
Mat drawHist(Mat &frame, int numThreads) {
int hist[256] = {0}; //init
#pragma omp parallel reduction(+:hist) default(none) shared(frame)
{
#pragma omp for
for (int i = 1; i < frame.rows-1; i++) {
for (int j = 1; j < frame.cols-1; j++) {
bitset code = createCode(frame, i, j);
hist[code.to_ulong()]++;
}
}
}
//some other stuff
Здесь я нашел список всех компиляторов, поддерживающих более новую версию omp, но я не хочу снова сталкиваться с проблемой mingw и ссылками на библиотеку opencv.
Есть какие-нибудь предложения о том, какой еще компилятор мне следует использовать или, может быть, как правильно связать OpenCV с mingw? Спасибо большое!
P.s. Я использую Windows и знаю, что это, вероятно, основная причина всех моих проблем...
Подробнее здесь: https://stackoverflow.com/questions/791 ... -same-time
Мобильная версия