apollo icon indicating copy to clipboard operation
apollo copied to clipboard

Optimize bug on aarch64

Open chenzhengxi opened this issue 4 years ago • 10 comments

Describe the bug platform:aarch64, gcc8.2, build option: release or -O1 CRoutine::GetCurrentRoutine() return nullptr after current_routine_ = this; build option: debug It's OK

To Reproduce

  1. write 2 node(pub, sub)
  2. build with release, and run
  3. reason: May be some optimize option make GetCurrentRoutine get the old value.
  4. solve: build with debug option or fix the code
  static CRoutine *GetCurrentRoutine()__attribute__((optimize("-O0")));
  RoutineState Resume()__attribute__((optimize("-O0")));

chenzhengxi avatar Jan 20 '21 07:01 chenzhengxi

追加-fPIC就行了, 包括apollo的arm64下的docker中也需要加

leeyuanalibaba avatar Mar 30 '21 05:03 leeyuanalibaba

追加-fPIC就行了, 包括apollo的arm64下的docker中也需要加

加过了,我是移植到Xilinx Zynq平台,CMake构建

cmake_minimum_required(VERSION 3.0)
if(" ${CMAKE_SOURCE_DIR}" STREQUAL " ${CMAKE_BINARY_DIR}")
    message(FATAL_ERROR "
        FATAL: In-source builds are not allowed.
        You should create a separate directory for build files.
        ")
endif()

project(cyber_core LANGUAGES C CXX)
ENABLE_LANGUAGE(ASM)
set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS}")

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/../
    ${CMAKE_CURRENT_SOURCE_DIR}/../include 
    ${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/include 
    ${CMAKE_SYSROOT}/usr/include)

set(target_supports_shared_libs true)
file(GLOB_RECURSE DIR_SRCS
       ${CMAKE_CURRENT_SOURCE_DIR}/time/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/timer/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/blocker/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/component/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/transport/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/logger/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/io/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/common/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/task/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/scheduler/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/croutine/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/node/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/message/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/service_discovery/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/record/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/parameter/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_aarch64.S
       #${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_x86_64.S
       ${CMAKE_CURRENT_SOURCE_DIR}/proto/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/sysmo/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/event/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/state.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/binary.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/init.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/cyber.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/class_loader/*.cc
       )
add_library(${PROJECT_NAME} SHARED ${DIR_SRCS})
install(TARGETS ${PROJECT_NAME}
        LIBRARY DESTINATION lib  # 动态库安装路径
        ARCHIVE DESTINATION lib  # 静态库安装路径
        RUNTIME DESTINATION bin  # 可执行文件安装路径
        )

chenzhengxi avatar Mar 31 '21 07:03 chenzhengxi

追加-fPIC就行了, 包括apollo的arm64下的docker中也需要加

加过了,我是移植到Xilinx Zynq平台,CMake构建

cmake_minimum_required(VERSION 3.0)
if(" ${CMAKE_SOURCE_DIR}" STREQUAL " ${CMAKE_BINARY_DIR}")
    message(FATAL_ERROR "
        FATAL: In-source builds are not allowed.
        You should create a separate directory for build files.
        ")
endif()

project(cyber_core LANGUAGES C CXX)
ENABLE_LANGUAGE(ASM)
set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS}")

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/../
    ${CMAKE_CURRENT_SOURCE_DIR}/../include 
    ${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/include 
    ${CMAKE_SYSROOT}/usr/include)

set(target_supports_shared_libs true)
file(GLOB_RECURSE DIR_SRCS
       ${CMAKE_CURRENT_SOURCE_DIR}/time/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/timer/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/blocker/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/component/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/transport/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/logger/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/io/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/common/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/task/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/scheduler/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/croutine/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/node/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/message/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/service_discovery/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/record/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/parameter/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_aarch64.S
       #${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_x86_64.S
       ${CMAKE_CURRENT_SOURCE_DIR}/proto/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/sysmo/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/event/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/state.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/binary.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/init.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/cyber.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/class_loader/*.cc
       )
add_library(${PROJECT_NAME} SHARED ${DIR_SRCS})
install(TARGETS ${PROJECT_NAME}
        LIBRARY DESTINATION lib  # 动态库安装路径
        ARCHIVE DESTINATION lib  # 静态库安装路径
        RUNTIME DESTINATION bin  # 可执行文件安装路径
        )

我自己的是Xavier上 是可以的

leeyuanalibaba avatar Mar 31 '21 07:03 leeyuanalibaba

@

追加-fPIC就行了, 包括apollo的arm64下的docker中也需要加

加过了,我是移植到Xilinx Zynq平台,CMake构建

cmake_minimum_required(VERSION 3.0)
if(" ${CMAKE_SOURCE_DIR}" STREQUAL " ${CMAKE_BINARY_DIR}")
    message(FATAL_ERROR "
        FATAL: In-source builds are not allowed.
        You should create a separate directory for build files.
        ")
endif()

project(cyber_core LANGUAGES C CXX)
ENABLE_LANGUAGE(ASM)
set(CMAKE_COLOR_MAKEFILE ON)
set(CMAKE_VERBOSE_MAKEFILE ON)
set(CMAKE_CXX_STANDARD 14)
set(CMAKE_C_STANDARD 99)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)
set(CMAKE_BUILD_TYPE Release)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -fpic")
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -fpic")
set(CMAKE_ASM_FLAGS "${CMAKE_ASM_FLAGS}")

include_directories(
    ${CMAKE_CURRENT_SOURCE_DIR}/../
    ${CMAKE_CURRENT_SOURCE_DIR}/../include 
    ${CMAKE_CURRENT_SOURCE_DIR}/../thirdparty/include 
    ${CMAKE_SYSROOT}/usr/include)

set(target_supports_shared_libs true)
file(GLOB_RECURSE DIR_SRCS
       ${CMAKE_CURRENT_SOURCE_DIR}/time/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/timer/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/blocker/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/component/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/transport/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/logger/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/io/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/common/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/task/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/scheduler/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/croutine/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/node/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/message/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/service_discovery/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/record/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/parameter/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_aarch64.S
       #${CMAKE_CURRENT_SOURCE_DIR}/croutine/detail/swap_x86_64.S
       ${CMAKE_CURRENT_SOURCE_DIR}/proto/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/sysmo/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/event/*.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/state.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/binary.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/init.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/cyber.cc
       ${CMAKE_CURRENT_SOURCE_DIR}/class_loader/*.cc
       )
add_library(${PROJECT_NAME} SHARED ${DIR_SRCS})
install(TARGETS ${PROJECT_NAME}
        LIBRARY DESTINATION lib  # 动态库安装路径
        ARCHIVE DESTINATION lib  # 静态库安装路径
        RUNTIME DESTINATION bin  # 可执行文件安装路径
        )

查查你的protobuf 有没有PIC

leeyuanalibaba avatar Apr 01 '21 12:04 leeyuanalibaba

arm64版本的gcc 默认是不带PIC的,所以需要check你的每一个thirdpart包 都要确保PIC 才能解决你的问题

leeyuanalibaba avatar Apr 01 '21 12:04 leeyuanalibaba

apollo arm版本的docker也有这个问题, @storypku

leeyuanalibaba avatar Apr 01 '21 12:04 leeyuanalibaba

@leeyuanalibaba 你说的docker也有这个问题,请问是具体修改哪个位置?

xhzzhang avatar Jul 04 '23 03:07 xhzzhang

编译选项里加  -fPIC ​

shadowMan @.***

Original

From:"Zhang Xu-Hui"< @.*** >;

Date:2023/7/4 11:08

To:"ApolloAuto/apollo"< @.*** >;

CC:"leeyuanalibaba"< @.*** >;"Mention"< @.*** >;

Subject:Re: [ApolloAuto/apollo] Optimize bug on aarch64 (#13351)

@leeyuanalibaba 你说的docker也有这个问题,请问是具体修改哪个位置?

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

leeyuanalibaba avatar Jul 05 '23 07:07 leeyuanalibaba

Describe the bug platform:aarch64, gcc8.2, build option: release or -O1 CRoutine::GetCurrentRoutine() return nullptr after current_routine_ = this; build option: debug It's OK

To Reproduce

  1. write 2 node(pub, sub)
  2. build with release, and run
  3. reason: May be some optimize option make GetCurrentRoutine get the old value.
  4. solve: build with debug option or fix the code
  static CRoutine *GetCurrentRoutine()__attribute__((optimize("-O0")));
  RoutineState Resume()__attribute__((optimize("-O0")));

inline CRoutine* CRoutine::GetCurrentRoutine() { #if defined aarch64 _sync_synchronize(); #endif return current_routine; } can sovle this problem

xmuchen avatar Jul 28 '23 09:07 xmuchen

static CRoutine GetCurrentRoutine()attribute((optimize("-O0"))); RoutineState Resume()attribute((optimize("-O0"))); inline CRoutine CRoutine::GetCurrentRoutine() { #if defined aarch64 _sync_synchronize(); #endif return current_routine; }

确定修改这部分就能解决问题吗,我这边按照这个修改依然还是有问题

Bwolf89 avatar Apr 10 '24 08:04 Bwolf89