プロジェクト

全般

プロフィール

A/I #4

未完了

コンパイラや開発言語によらず、処理速度を同じ単位・CPUクロック数で比較できる関数を作る

開発 次郎 さんが8ヶ月前に追加. 7ヶ月前に更新.

ステータス:
休止中
優先度:
通常
担当者:
開始日:
2025/04/12
期日:
予定工数:

説明

リポジトリ

リポジトリはGitHubに置く。

https://github.com/tacchang001/MeasureTime

開発 次郎 さんが8ヶ月前に更新 · 編集済み

用語調査

純粋な処理時間を表す言葉は?

  • 経過実時間(elapsed real time)
    • コンピュータプログラムの開始から終了までにかかった実際の時間。タスクが終了した時刻とタスクが開始した時刻の差
    • ウォール・クロック・タイム(wall-clock time、WCT、壁時計時間)、ウォール・タイム(wall time)とも言う
    • プログラムによる遅延やリソースが使えるようになるまでの待ち時間等、アーキテクチャやランタイムに依存する要因が 含まれる
    • 多くのCPUで同時に並行して実行するプログラムの場合、CPU時間が経過実時間の何倍もの値になる
  • 実時間(real time)
    • 入力データの処理が瞬時に行なわれること。経過時間や実行時間と呼ばれることもあるが、これらは後述のCPU時間との区別が曖昧である。
  • CPU時間
    • CPUが動作している時間
    • プログラムによる遅延やリソースが使えるようになるまでの待ち時間等、アーキテクチャやランタイムに依存する要因が 含まれない
  • ユーザ時間
    • CPUがユーザー空間でコードを実行するのに忙しかった時間
  • システム時間
    • CPUがカーネル空間でコードを実行するのに忙しかった時間
      • この値がスレッドまたはプロセスについて報告されている場合は、たとえば、スレッドがシステムコールを発行した後など、実行中のコンテキストに代わってカーネルが作業を行っていた時間を表す
  • 並行と並列
    • 並行(Concurrent)
      • CPUがタスクを切り替えながら処理すること
      • リソースを効率的に使用するため、処理を同時に進めることが目的
    • 並列(Parallel)
      • 複数のタスクが物理的に同時に実行される状態です。マルチコアCPUが各コアで異なるタスクを同時に処理すること
      • 処理を早くこなすことが目的

開発 次郎 さんが7ヶ月前に更新

開発 次郎 さんが7ヶ月前に更新

トラブルシューティング

トラブル

次のCMakefile.txtだと実行時に得体のしれないエラーになる。

# たぶん、これが原因。後述するが、ソースからGoogleTestをビルドした場合はこの現象にならない
find_package(GTest REQUIRED)

# たぶん、これは関係ない
set(CMAKE_CXX_FLAGS "-static -lstdc++ -lgcc -lwinpthread")

# たぶん、これは関係ない
file(GLOB_RECURSE TESTS test_*.cpp)

# たぶん、これらは関係ない
include(GoogleTest)
add_executable(${PROJECT_NAME}-googletest ${TESTS})
target_include_directories(${PROJECT_NAME}-googletest PRIVATE ../lib/include)
target_link_libraries(${PROJECT_NAME}-googletest GTest::GTest GTest::Main ${PROJECT_NAME})
gtest_add_tests(TARGET ${PROJECT_NAME}-googletest)

得体のしれないエラー

$ build/tests/MeasureTime-googletest.exe
      0 [main] MeasureTime-googletest (23320) child_copy: cygheap read copy failed, 0x800000000..0x80000FDB0, done 0, windows pid 23320, Win32 error 6
    477 [main] MeasureTime-googletest 548 D:\src\MeasureTime\cpp\build\tests\MeasureTime-googletest.exe: *** fatal error - couldn't create signal pipe, Win32 error 5

解決方法

GoogleTestはソースからビルドする。

set(CMAKE_CXX_FLAGS "-static -lstdc++ -lgcc -lwinpthread")

file(GLOB_RECURSE TESTS test_*.cpp)

# https://qiita.com/utkamioka/items/cacb1001bd2abf605b15
include(FetchContent)
FetchContent_Declare(
  googletest
  DOWNLOAD_EXTRACT_TIMESTAMP ON
  GIT_REPOSITORY https://github.com/google/googletest.git
  GIT_TAG        v1.16.0
)
if (WIN32)
# For Windows: Prevent overriding the parent project's compiler/linker settings
    set(gtest_force_shared_crt ON CACHE BOOL "" FORCE)
endif()
FetchContent_MakeAvailable(googletest)

file(GLOB_RECURSE TESTS test_*.cpp)

add_executable(${PROJECT_NAME}-googletest ${TESTS})
target_link_libraries(${PROJECT_NAME}-googletest gtest_main ${PROJECT_NAME})
target_include_directories(${PROJECT_NAME}-googletest PRIVATE ../lib/include)
include(GoogleTest)
gtest_discover_tests(${PROJECT_NAME}-googletest)

次のコマンドでMSYS2用のgtestをインストールしたのだが、これだとダメ見たい。原因不明。判明しそうもないので追及もしない。

$ pacman -S gtest
$ pacman -Qs gtest
local/gtest 1.16.0-1
    Google Test - C++ testing utility

開発 次郎 さんが7ヶ月前に更新 · 編集済み

トラブルシューティング

トラブル

cmakeで作成したMakefileでmakeできない。

$ make
/usr/bin/cmake.exe -S/d/src/MeasureTime/cpp -B/d/src/MeasureTime/cpp/build --check-build-system CMakeFiles/Makefile.cmake 0
/usr/bin/cmake.exe -E cmake_progress_start /d/src/MeasureTime/cpp/build/CMakeFiles /d/src/MeasureTime/cpp/build//CMakeFiles/progress.marks
make -f CMakeFiles/Makefile2 all
make1: Entering directory '/d/src/MeasureTime/cpp/build'
make -f lib/CMakeFiles/MeasureTime.dir/build.make lib/CMakeFiles/MeasureTime.dir/depend
make2: Entering directory '/d/src/MeasureTime/cpp/build'
cd /d/src/MeasureTime/cpp/build && /usr/bin/cmake.exe -E cmake_depends "Unix Makefiles" /d/src/MeasureTime/cpp /d/src/MeasureTime/cpp/lib /d/src/MeasureTime/cpp/build /d/src/MeasureTime/cpp/build/lib /d/src/MeasureTime/cpp/build/lib/CMakeFiles/MeasureTime.dir/DependInfo.cmake "--color="
make2: Leaving directory '/d/src/MeasureTime/cpp/build'
make -f lib/CMakeFiles/MeasureTime.dir/build.make lib/CMakeFiles/MeasureTime.dir/build
make2: Entering directory '/d/src/MeasureTime/cpp/build'
lib/CMakeFiles/MeasureTime.dir/compiler_depend.make:4: multiple target patterns. Stop.
make2: Leaving directory '/d/src/MeasureTime/cpp/build'
make1: [CMakeFiles/Makefile2:224: lib/CMakeFiles/MeasureTime.dir/all] Error 2
make1: Leaving directory '/d/src/MeasureTime/cpp/build'
make: [Makefile:149: all] Error 2

解決に向けてトライ

  • chocolateyでWindows用のmakeコマンドをインストールしてみたが、MSYS2の/d/ProgramData/形式のパスに対応していない

解決方法

  • mingw-w64-x86_64-cmake をインストールする
    • pacman -S mingw-w64-x86_64-cmake インストール履歴
    • makeを変えなくても問題がなくなった
    • (旧)/usr/bin/cmake 4.0.0
    • (新)/mingw64/bin/cmake 4.0.0

開発 次郎 さんが7ヶ月前に更新

  • ステータス新規 から 休止中 に変更

トラブルシューティング

  • 現象
    • 処理速度がゼロになる
  • 原因
    • GCC4では時間分解能が落ちるらしく、sin程度の関数の場合処理時間がゼロになる
    • GCC14では期待通りの分解能
  • 時間の単位をCPU時刻(ナノ秒)からCPUクロック・カウンタ数に変更した
    • 今のところ、Intel CPUのみサポート
    • ARMに対応することはできるようだが試す環境がないのでやらない

他の形式にエクスポート: Atom PDF