Здравствуйте. Решил попробывать разпараллелить свой проект. Для конфигурирования используется cmake. Для компиляции gcc и g++ под Ubuntu. В cmake добавил опцию -fopenmp -o mm_openmp. Инклуды в коде есть. Компиляция идет нормально, но при линковке возникают ошибки:
Код:
Linking CXX executable worldserver
../game/libgame.a(World.cpp.o): In function `World::SetInitialWorldSettings()':
/home/wow/Kseniya/src/server/game/World/World.cpp:1798: undefined reference to `omp_set_dynamic'
/home/wow/Kseniya/src/server/game/World/World.cpp:1803: undefined reference to `omp_set_num_threads'
/home/wow/Kseniya/src/server/game/World/World.cpp:1807: undefined reference to `omp_get_thread_num'
../game/libgame.a(BattlegroundWS.cpp.o): In function `BattlegroundWS::StartingEventCloseDoors()':
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:180: undefined reference to `omp_set_dynamic'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:181: undefined reference to `omp_set_num_threads'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:187: undefined reference to `GOMP_parallel_start'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:187: undefined reference to `GOMP_parallel_end'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:196: undefined reference to `GOMP_parallel_start'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:196: undefined reference to `GOMP_parallel_end'
../game/libgame.a(BattlegroundWS.cpp.o): In function `BattlegroundWS::StartingEventOpenDoors()':
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:210: undefined reference to `GOMP_parallel_start'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:210: undefined reference to `GOMP_parallel_end'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:216: undefined reference to `GOMP_parallel_start'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:216: undefined reference to `GOMP_parallel_end'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:227: undefined reference to `GOMP_parallel_start'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:227: undefined reference to `GOMP_parallel_end'
../game/libgame.a(BattlegroundWS.cpp.o): In function `_ZN14BattlegroundWS22StartingEventOpenDoorsEv.omp_fn.0':
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:211: undefined reference to `omp_get_num_threads'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:211: undefined reference to `omp_get_thread_num'
../game/libgame.a(BattlegroundWS.cpp.o): In function `_ZN14BattlegroundWS22StartingEventOpenDoorsEv.omp_fn.1':
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:217: undefined reference to `omp_get_num_threads'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:217: undefined reference to `omp_get_thread_num'
../game/libgame.a(BattlegroundWS.cpp.o): In function `_ZN14BattlegroundWS22StartingEventOpenDoorsEv.omp_fn.2':
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:228: undefined reference to `omp_get_num_threads'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:228: undefined reference to `omp_get_thread_num'
../game/libgame.a(BattlegroundWS.cpp.o): In function `_ZN14BattlegroundWS23StartingEventCloseDoorsEv.omp_fn.3':
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:188: undefined reference to `omp_get_num_threads'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:188: undefined reference to `omp_get_thread_num'
../game/libgame.a(BattlegroundWS.cpp.o): In function `_ZN14BattlegroundWS23StartingEventCloseDoorsEv.omp_fn.4':
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:197: undefined reference to `omp_get_num_threads'
/home/wow/Kseniya/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp:197: undefined reference to `omp_get_thread_num'
collect2: ld returned 1 exit status
make[2]: *** [src/server/worldserver/worldserver] Ошибка 1
make[1]: *** [src/server/worldserver/CMakeFiles/worldserver.dir/all] Ошибка 2
make: *** [all] Ошибка 2
Код:
root@mynet:/home/wow/Kseniya/build# gcc --version
gcc (Ubuntu 4.4.3-4ubuntu5) 4.4.3
Copyright (C) 2009 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
Кусок кода где ошибки:
Код:
void BattlegroundWS::StartingEventOpenDoors()
{
uint32 i, start, end;
start = BG_WS_OBJECT_DOOR_A_1;
end = BG_WS_OBJECT_DOOR_A_4;
#pragma omp parallel for shared(start, end) private(i)
for (i = start; i <= end; ++i)
DoorOpen(i);
start = BG_WS_OBJECT_DOOR_H_1;
end = BG_WS_OBJECT_DOOR_H_2;
#pragma omp parallel for shared(start, end) private(i)
for (i = BG_WS_OBJECT_DOOR_H_1; i <= BG_WS_OBJECT_DOOR_H_2; ++i)
DoorOpen(i);
SpawnBGObject(BG_WS_OBJECT_DOOR_A_5, RESPAWN_ONE_DAY);
SpawnBGObject(BG_WS_OBJECT_DOOR_A_6, RESPAWN_ONE_DAY);
SpawnBGObject(BG_WS_OBJECT_DOOR_H_3, RESPAWN_ONE_DAY);
SpawnBGObject(BG_WS_OBJECT_DOOR_H_4, RESPAWN_ONE_DAY);
start = BG_WS_OBJECT_A_FLAG;
end = BG_WS_OBJECT_BERSERKBUFF_2;
#pragma omp parallel for shared(start, end) private(i)
for (i = start; i <= end; ++i)
SpawnBGObject(i, RESPAWN_IMMEDIATELY);
// players joining later are not egible
StartTimedAchievement(ACHIEVEMENT_TIMED_TYPE_EVENT, WS_EVENT_START_BATTLE);
}
Код:
sLog.outString("OpenMP: Starting using OpenMP system.");
if(getConfig(CONFIG_OPENMP_ISDYNAMIC))
{
omp_set_dynamic(1);
sLog.outString("OpenMP: Using autodetect num threads.");
}
else
{
omp_set_num_threads(getConfig(CONFIG_OPENMP_THREADS));
sLog.outString("OpenMP: Using basic num threads.");
}
sLog.outString("OpenMP: Using %d threads.", omp_get_thread_num());