Russian Qt Forum
Ноябрь 23, 2024, 08:40 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: qbs и OpenMP [Решено]  (Прочитано 4563 раз)
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« : Апрель 21, 2015, 00:03 »

Что и в каком месте нужно указать в qbs файле для того, чтобы включить поддержку компилятором директив OpenMP, в частности #pragma omp parallel for для, например комплиятора VS2013 (опция компилятора /openmp)
« Последнее редактирование: Апрель 21, 2015, 20:58 от xokc » Записан
alex312
Хакер
*****
Offline Offline

Сообщений: 606



Просмотр профиля
« Ответ #1 : Апрель 21, 2015, 04:32 »


Приблизительный набросок:
Код
Javascript
CppApplication {
......
cpp.cxxFlags:{
           var flags = base
           if(cpp.compilerName.contains("g++"))
               flags = flags.concat(["--enable_omp_gcc"])
           if(cpp.compilerName.contains("msvc"))
               flags = flags.concat(["/openmp"])
           return flags
       }
.....
}
 
« Последнее редактирование: Апрель 21, 2015, 04:34 от alex312 » Записан
Авварон
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 3260


Просмотр профиля
« Ответ #2 : Апрель 21, 2015, 09:49 »

base и concat не нужны в данном примере, cxxFlags всегда пустые (дефолтные флаги живут в другой проперти и конкатятся сами)
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #3 : Апрель 21, 2015, 15:14 »

Добавил
cpp.cxxFlags: "/openmp"

Не помогло. Этот код
Код
C++ (Qt)
#pragma omp parallel for
for (int i = 0; i < 4; ++i)
printf("%.8X - %d\n", GetCurrentThreadId(), i);
 
из под VisualStudio c /openmp даёт ожидаемое:
Код
DOS
000041F8 - 0
00002830 - 1
00005C14 - 2
00005F30 - 3
 
А из под Creator
Код
DOS
00002DF8 - 0
00002DF8 - 1
00002DF8 - 2
00002DF8 - 3
 
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #4 : Апрель 21, 2015, 17:14 »

Существует ли вообще какой-нибудь простой способ узнать с какими параметрами вызван компилятор при использовании qbs? Для pro проектов эта информация была в make файлах и выводилась в консоль сборки Creator. Для qbs же make файлы как я понял не создаются, а в консоли сборки вижу только это:
Код
DOS
17:12:45: Выполняются этапы для проекта untitled...
compiling main.c
linking untitled.exe
embedding manifest into untitled.exe
17:12:46: Прошло времени: 00:01.
Очень информативно Грустный
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #5 : Апрель 21, 2015, 20:47 »

Как-то я сам с собой беседую.  Грустный
Отловил вызов компилятора с cpp.cxxFlags: "/openmp":
Код
DOS
"C:\Program Files (x86)\Microsoft Visual Studio 12.0\VC\BIN\x86_amd64\cl.exe"  /nologo /c /EHsc /Zi /MDd /DUNICODE /D_UNICODE /DWINVER=0x502 /D_WIN32_WINNT=0x502 /D_WIN32_WINDOWS=0x502 /FoC:\Users\ok\build-untitled3-Desktop_Отладка\qtc_Desktop_Qt_5_4_0_MSVC2013_OpenGL_64bit-debug\untitled3.qtc_Desktop_Qt_5_4_0_MSVC2013_OpenGL_64bit\.obj\main.c.obj C:\Users\ok\untitled3\main.c /TC /FS
 
Как легко заметить никакого чебурашки /openmp тут нет. Так что, похоже, что cpp.cxxFlags на MSVC вообще никакого влияния не оказывает. Пошёл курить исходники qbs. Вот маразм, то!
Записан
xokc
Птица говорун
*****
Offline Offline

Сообщений: 976



Просмотр профиля
« Ответ #6 : Апрель 21, 2015, 20:58 »

Как ни странно, но исходники помогли. Улыбающийся В частности, msvc.js, а именно:
Код
Javascript
 
if (tag === "cpp") {
       args = args.concat(
                   ModUtils.moduleProperties(input, 'platformCxxFlags'),
                   ModUtils.moduleProperties(input, 'cxxFlags'));
   } else if (tag === "c") {
       args = args.concat(
                   ModUtils.moduleProperties(input, 'platformCFlags'),
                   ModUtils.moduleProperties(input, 'cFlags'));
   }
 
Как можно заметить в командной строке компилятора из предыдущего поста, у меня был не main.cpp, а main.c и, соответственно, нужно использовать не cxxFlags, a cFlags. Ну, или переименовать main.c в main.cpp, что и было сделано. Нужный ключ в командной строке компилятора появился и OpenMP отработал. Тему пометил как решенную.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.262 секунд. Запросов: 23.