diff --git a/.clang-tidy b/.clang-tidy index 14c252dfa08..16bc9513dfa 100644 --- a/.clang-tidy +++ b/.clang-tidy @@ -17,6 +17,7 @@ Checks: > -bugprone-implicit-widening-of-multiplication-result, -bugprone-integer-division, -bugprone-macro-parentheses, + -bugprone-misplaced-widening-cast, -bugprone-narrowing-conversions, -bugprone-string-integer-assignment, -bugprone-suspicious-include, @@ -98,7 +99,6 @@ Checks: > -hicpp-named-parameter, -hicpp-no-array-decay, -hicpp-no-malloc, - -hicpp-no-malloc, -hicpp-noexcept-move, -hicpp-signed-bitwise, -hicpp-special-member-functions, @@ -154,7 +154,6 @@ Checks: > -performance-inefficient-string-concatenation, -performance-inefficient-vector-operation, -performance-move-const-arg, - -performance-move-const-arg, -performance-move-constructor-init, -performance-no-int-to-ptr, -performance-noexcept-move-constructor, diff --git a/.github/workflows/all-post-commit-workflows.yaml b/.github/workflows/all-post-commit-workflows.yaml index e4817e6e4fd..30dc542c6f9 100644 --- a/.github/workflows/all-post-commit-workflows.yaml +++ b/.github/workflows/all-post-commit-workflows.yaml @@ -168,6 +168,12 @@ jobs: with: arch: ${{ matrix.test-group.arch }} runner-label: ${{ matrix.test-group.runner-label }} + code-analysis: + needs: build-docker-image-2204 + uses: ./.github/workflows/code-analysis.yaml + secrets: inherit + with: + os: ubuntu-22.04-amd64 tt-train-cpp-unit-tests: needs: build-artifact secrets: inherit diff --git a/.github/workflows/code-analysis.yaml b/.github/workflows/code-analysis.yaml new file mode 100644 index 00000000000..1c0c912f15b --- /dev/null +++ b/.github/workflows/code-analysis.yaml @@ -0,0 +1,105 @@ +name: "Code analysis" + +on: + workflow_call: + inputs: + os: + required: false + type: string + default: "ubuntu-22.04-amd64" + workflow_dispatch: + inputs: + os: + required: false + type: string + default: "ubuntu-22.04-amd64" + +jobs: + build-docker-image: + uses: ./.github/workflows/build-docker-artifact.yaml + secrets: inherit + with: + os: ${{ inputs.os }} + + + clang-tidy: + needs: build-docker-image + env: + ARCH_NAME: wormhole_b0 + runs-on: + - build + - in-service + steps: + - name: Verify ccache availability + shell: bash + run: | + if [ ! -d "/mnt/MLPerf/ccache" ]; then + echo "::error title=ccache-mlperf-not-mounted::NFS drive is not mounted; build machine not properly provisioned." + exit 1 + fi + if [ ! -d "$HOME/.ccache-ci" ]; then + echo "::error title=ccache-not-provisioned::Ccache is not properly provisioned." + exit 1 + fi + - uses: tenstorrent-metal/metal-workflows/.github/actions/checkout-with-submodule-lfs@v2.0.0 + - name: Set up dynamic env vars for build + run: | + echo "TT_METAL_HOME=$(pwd)" >> $GITHUB_ENV + echo "RUNNER_UID=$(id -u)" >> $GITHUB_ENV + echo "RUNNER_GID=$(id -g)" >> $GITHUB_ENV + - name: Update submodules + run: | + git submodule update --init --recursive + - name: Generate docker tag + id: generate-docker-tag + uses: ./.github/actions/generate-docker-tag + with: + image: ${{ inputs.os }} + - name: Docker login + uses: docker/login-action@v3 + with: + registry: https://ghcr.io + username: ${{ github.actor }} + password: ${{ secrets.GITHUB_TOKEN }} + - name: Pull docker image + run: docker pull ${{ env.TT_METAL_DOCKER_IMAGE_TAG }} + - name: Analyze code with clang-tidy + uses: addnab/docker-run-action@v3 + with: + image: ${{ env.TT_METAL_DOCKER_IMAGE_TAG }} + options: | + --rm + --tmpfs /tmp + -u ${{ env.RUNNER_UID }}:${{ env.RUNNER_GID }} + --group-add 1457 + -v ${{ github.workspace }}:${{ github.workspace }} + -v /etc/passwd:/etc/passwd:ro + -v /etc/shadow:/etc/shadow:ro + -v /etc/bashrc:/etc/bashrc:ro + -v /home/ubuntu/.ccache-ci:/home/ubuntu/.ccache + -v /mnt/MLPerf/ccache:/mnt/MLPerf/ccache + -e ARCH_NAME=${{ env.ARCH_NAME }} + -e CARGO_HOME=${{ github.workspace }}/.cargo + -w ${{ github.workspace }} + run: | + set -eu # basic shell hygiene + + # /tmp is a tmpfs; more efficient than persisted storage + mkdir -p /tmp/ccache + export CCACHE_TEMPDIR=/tmp/ccache + + # Zero out the stats so we can see how we did this build + # NOTE: may be inaccurate if we have >1 build runner on the same machine, using the same local cache + ccache -z + + cmake --preset clang-tidy + # cmake -B .build/clang-tidy -G Ninja -DCMAKE_BUILD_TYPE=RelWithDebInfo -DCMAKE_CXX_CLANG_TIDY=clang-tidy-17 -DTT_UNITY_BUILDS=FALSE -DCMAKE_DISABLE_PRECOMPILE_HEADERS=TRUE -DENABLE_CCACHE=TRUE -DTT_METAL_BUILD_TESTS=TRUE -DTTNN_BUILD_TESTS=TRUE -DBUILD_PROGRAMMING_EXAMPLES=TRUE -DBUILD_TT_TRAIN=TRUE + nice -n 19 cmake --build --preset clang-tidy + mkdir out + ccache -s > out/ccache.stats + - name: Publish Ccache summary + run: | + echo '## CCache Summary' >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY + cat out/ccache.stats >> $GITHUB_STEP_SUMMARY + echo '```' >> $GITHUB_STEP_SUMMARY diff --git a/.gitignore b/.gitignore index b0967985a2e..3355872cd00 100644 --- a/.gitignore +++ b/.gitignore @@ -13,6 +13,7 @@ tt_debug build build_* /python_env/ +CMakeUserPresets.json /llk_out/ /out/ diff --git a/CMakePresets.json b/CMakePresets.json new file mode 100644 index 00000000000..922fa231ad7 --- /dev/null +++ b/CMakePresets.json @@ -0,0 +1,46 @@ +{ + "version": 3, + "configurePresets": [ + { + "name": "default", + "displayName": "Default Config", + "description": "Default build of all the code using Ninja", + "generator": "Ninja Multi-Config", + "binaryDir": "${sourceDir}/.build/default", + "cacheVariables": { + "TT_METAL_BUILD_TESTS": {"value": "TRUE"}, + "TTNN_BUILD_TESTS": {"value": "TRUE"}, + "TT_UMD_BUILD_TESTS": {"value": "TRUE"}, + "BUILD_PROGRAMMING_EXAMPLES": {"value": "TRUE"}, + "BUILD_TT_TRAIN": {"value": "TRUE"}, + "CMAKE_DISABLE_PRECOMPILE_HEADERS": {"value": "TRUE"}, + "ENABLE_CCACHE": {"value": "TRUE"}, + "TT_UNITY_BUILDS": {"value": "FALSE"} + } + }, + { + "name": "clang-tidy", + "inherits": "default", + "description": "Run Clang Tidy", + "binaryDir": "${sourceDir}/.build/clang-tidy", + "cacheVariables": { + "CMAKE_CXX_CLANG_TIDY": {"value": "clang-tidy-17;--warnings-as-errors=*"}, + "CMAKE_VERIFY_INTERFACE_HEADER_SETS": {"value": "TRUE"}, + "CMAKE_EXPORT_COMPILE_COMMANDS": {"value": "TRUE"} + } + } + ], + "buildPresets": [ + { + "name": "dev", + "configurePreset": "default", + "configuration": "RelWithDebInfo", + "targets": ["all"] + }, + { + "name": "clang-tidy", + "configurePreset": "clang-tidy", + "configuration": "RelWithDebInfo" + } + ] + } diff --git a/dockerfile/ubuntu-20.04-amd64.Dockerfile b/dockerfile/ubuntu-20.04-amd64.Dockerfile index 7c23b58503f..29d846cd495 100644 --- a/dockerfile/ubuntu-20.04-amd64.Dockerfile +++ b/dockerfile/ubuntu-20.04-amd64.Dockerfile @@ -78,6 +78,7 @@ RUN apt-get -y update \ && apt-get install -y --no-install-recommends \ libc++-17-dev \ libc++abi-17-dev \ + clang-tidy-17 \ && rm -rf /var/lib/apt/lists/* RUN mkdir -p /usr/app diff --git a/dockerfile/ubuntu-22.04-amd64.Dockerfile b/dockerfile/ubuntu-22.04-amd64.Dockerfile index 77d24d9f61d..404e161c543 100644 --- a/dockerfile/ubuntu-22.04-amd64.Dockerfile +++ b/dockerfile/ubuntu-22.04-amd64.Dockerfile @@ -75,6 +75,7 @@ RUN apt-get -y update \ && apt-get install -y --no-install-recommends \ libc++-17-dev \ libc++abi-17-dev \ + clang-tidy-17 \ && rm -rf /var/lib/apt/lists/* # Setup Env variables to setup Python Virtualenv - Install TT-Metal Python deps diff --git a/tt-train/.clang-tidy b/tt-train/.clang-tidy index a5ddf6e0843..4c3eb652765 100644 --- a/tt-train/.clang-tidy +++ b/tt-train/.clang-tidy @@ -1,30 +1,201 @@ -Checks: "*, - -abseil-*, - -altera-*, - -android-*, - -fuchsia-*, - -google-*, - -llvm*, - -modernize-use-trailing-return-type, - -zircon-*, - -readability-else-after-return, - -readability-static-accessed-through-instance, - -readability-avoid-const-params-in-decls, - -cppcoreguidelines-non-private-member-variables-in-classes, - -misc-non-private-member-variables-in-classes, - -include-what-you-use, - -cppcoreguidelines-avoid-magic-numbers, - -readability-magic-numbers, - -misc-include-cleaner, - -easily-swappable-parameters, - -misc-no-recursion -" -WarningsAsErrors: '' -HeaderFilterRegex: '' -FormatStyle: none +--- +# Clang Analyzer is disabled as we may prefer to run a dedicated scan with a report +# TODO: Evaluate the other checks +Checks: > + *, + -abseil-string-find-startswith, + -abseil-string-find-str-contains, + -altera-id-dependent-backward-branch, + -altera-struct-pack-align, + -altera-unroll-loops, + -android-cloexec-fopen, + -bugprone-assignment-in-if-condition, + -bugprone-branch-clone, + -bugprone-easily-swappable-parameters, + -bugprone-exception-escape, + -bugprone-fold-init-type, + -bugprone-implicit-widening-of-multiplication-result, + -bugprone-integer-division, + -bugprone-macro-parentheses, + -bugprone-misplaced-widening-cast, + -bugprone-narrowing-conversions, + -bugprone-string-integer-assignment, + -bugprone-suspicious-include, + -bugprone-switch-missing-default-case, + -bugprone-too-small-loop-variable, + -bugprone-unchecked-optional-access, + -bugprone-unhandled-self-assignment, + -bugprone-unused-raii, + -bugprone-use-after-move, + -cert-env33-c, + -cert-err09-cpp, + -cert-err33-c, + -cert-err34-c, + -cert-err58-cpp, + -cert-err61-cpp, + -cert-flp30-c, + -cert-msc30-c, + -cert-msc32-c, + -cert-msc50-cpp, + -cert-msc51-cpp, + -cert-oop11-cpp, + -cert-oop54-cpp, + -clang-analyzer-*, + -concurrency-mt-unsafe, + -cppcoreguidelines-avoid-c-arrays, + -cppcoreguidelines-avoid-const-or-ref-data-members, + -cppcoreguidelines-avoid-do-while, + -cppcoreguidelines-avoid-goto, + -cppcoreguidelines-avoid-magic-numbers, + -cppcoreguidelines-avoid-non-const-global-variables, + -cppcoreguidelines-c-copy-assignment-signature, + -cppcoreguidelines-explicit-virtual-functions, + -cppcoreguidelines-init-variables, + -cppcoreguidelines-macro-usage, + -cppcoreguidelines-narrowing-conversions, + -cppcoreguidelines-no-malloc, + -cppcoreguidelines-noexcept-move-operations, + -cppcoreguidelines-noexcept-swap, + -cppcoreguidelines-non-private-member-variables-in-classes, + -cppcoreguidelines-owning-memory, + -cppcoreguidelines-prefer-member-initializer, + -cppcoreguidelines-pro-bounds-array-to-pointer-decay, + -cppcoreguidelines-pro-bounds-constant-array-index, + -cppcoreguidelines-pro-bounds-pointer-arithmetic, + -cppcoreguidelines-pro-type-const-cast, + -cppcoreguidelines-pro-type-cstyle-cast, + -cppcoreguidelines-pro-type-member-init, + -cppcoreguidelines-pro-type-reinterpret-cast, + -cppcoreguidelines-pro-type-union-access, + -cppcoreguidelines-pro-type-vararg, + -cppcoreguidelines-rvalue-reference-param-not-moved, + -cppcoreguidelines-special-member-functions, + -cppcoreguidelines-use-default-member-init, + -fuchsia-default-arguments-calls, + -fuchsia-default-arguments-declarations, + -fuchsia-multiple-inheritance, + -fuchsia-overloaded-operator, + -fuchsia-statically-constructed-objects, + -fuchsia-trailing-return, + -google-build-using-namespace, + -google-default-arguments, + -google-explicit-constructor, + -google-readability-avoid-underscore-in-googletest-name, + -google-readability-braces-around-statements, + -google-readability-casting, + -google-readability-function-size, + -google-readability-namespace-comments, + -google-readability-todo, + -google-runtime-int, + -hicpp-avoid-c-arrays, + -hicpp-avoid-goto, + -hicpp-braces-around-statements, + -hicpp-deprecated-headers, + -hicpp-explicit-conversions, + -hicpp-function-size, + -hicpp-invalid-access-moved, + -hicpp-member-init, + -hicpp-move-const-arg, + -hicpp-multiway-paths-covered, + -hicpp-named-parameter, + -hicpp-no-array-decay, + -hicpp-no-malloc, + -hicpp-noexcept-move, + -hicpp-signed-bitwise, + -hicpp-special-member-functions, + -hicpp-uppercase-literal-suffix, + -hicpp-use-auto, + -hicpp-use-emplace, + -hicpp-use-equals-default, + -hicpp-use-nullptr, + -hicpp-use-override, + -hicpp-vararg, + -llvm-else-after-return, + -llvm-include-order, + -llvm-namespace-comment, + -llvm-qualified-auto, + -llvmlibc-callee-namespace, + -llvmlibc-implementation-in-namespace, + -llvmlibc-inline-function-decl, + -llvmlibc-restrict-system-libc-headers, + -misc-const-correctness, + -misc-include-cleaner, + -misc-no-recursion, + -misc-non-private-member-variables-in-classes, + -misc-redundant-expression, + -misc-throw-by-value-catch-by-reference, + -misc-unconventional-assign-operator, + -misc-uniqueptr-reset-release, + -misc-unused-parameters, + -misc-unused-using-decls, + -misc-use-anonymous-namespace, + -modernize-avoid-bind, + -modernize-avoid-c-arrays, + -modernize-concat-nested-namespaces, + -modernize-deprecated-headers, + -modernize-loop-convert, + -modernize-macro-to-enum, + -modernize-pass-by-value, + -modernize-return-braced-init-list, + -modernize-type-traits, + -modernize-use-auto, + -modernize-use-bool-literals, + -modernize-use-default-member-init, + -modernize-use-emplace, + -modernize-use-equals-default, + -modernize-use-nodiscard, + -modernize-use-nullptr, + -modernize-use-override, + -modernize-use-trailing-return-type, + -modernize-use-transparent-functors, + -modernize-use-using, + -performance-avoid-endl, + -performance-faster-string-find, + -performance-for-range-copy, + -performance-inefficient-string-concatenation, + -performance-inefficient-vector-operation, + -performance-move-const-arg, + -performance-move-constructor-init, + -performance-no-int-to-ptr, + -performance-noexcept-move-constructor, + -performance-noexcept-swap, + -performance-unnecessary-copy-initialization, + -performance-unnecessary-value-param, + -readability-avoid-const-params-in-decls, + -readability-avoid-unconditional-preprocessor-if, + -readability-braces-around-statements, + -readability-const-return-type, + -readability-container-contains, + -readability-container-data-pointer, + -readability-container-size-empty, + -readability-convert-member-functions-to-static, + -readability-duplicate-include, + -readability-else-after-return, + -readability-function-cognitive-complexity, + -readability-function-size, + -readability-identifier-length, + -readability-implicit-bool-conversion, + -readability-inconsistent-declaration-parameter-name, + -readability-isolate-declaration, + -readability-magic-numbers, + -readability-make-member-function-const, + -readability-misleading-indentation, + -readability-named-parameter, + -readability-non-const-parameter, + -readability-qualified-auto, + -readability-redundant-access-specifiers, + -readability-redundant-control-flow, + -readability-redundant-member-init, + -readability-redundant-smartptr-get, + -readability-redundant-string-cstr, + -readability-redundant-string-init, + -readability-simplify-boolean-expr, + -readability-static-accessed-through-instance, + -readability-static-definition-in-anonymous-namespace, + -readability-suspicious-call-argument, + -readability-uppercase-literal-suffix, + -readability-use-anyofallof CheckOptions: - - key: readability-identifier-length.IgnoredVariableNames - value: 'x|y|z|i|j|k|t|it|a|b' - - key: readability-identifier-length.IgnoredParameterNames - value: 'x|y|z|t|a|b' + - key: readability-function-cognitive-complexity.IgnoreMacros + value: true diff --git a/tt-train/3rd_party/CMakeLists.txt b/tt-train/3rd_party/CMakeLists.txt new file mode 100644 index 00000000000..4a0827901c1 --- /dev/null +++ b/tt-train/3rd_party/CMakeLists.txt @@ -0,0 +1,6 @@ +# Disable clang-tidy for all 3rd party code +set(CMAKE_C_CLANG_TIDY "") +set(CMAKE_CXX_CLANG_TIDY "") + +add_subdirectory(tokenizers-cpp) +add_subdirectory(wandb-cpp) diff --git a/tt-train/CMakeLists.txt b/tt-train/CMakeLists.txt index 38b5c784d61..cbf7638a79b 100644 --- a/tt-train/CMakeLists.txt +++ b/tt-train/CMakeLists.txt @@ -49,8 +49,12 @@ include(cmake/dependencies.cmake) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) # 3rd party projects -add_subdirectory(3rd_party/tokenizers-cpp) -add_subdirectory(3rd_party/wandb-cpp) +if(CMAKE_VERSION VERSION_LESS 3.25) + # FIXME(14681): `SYSTEM` was introduced in v3.25; remove this when we can require v3.25 + add_subdirectory(3rd_party EXCLUDE_FROM_ALL) +else() + add_subdirectory(3rd_party EXCLUDE_FROM_ALL SYSTEM) +endif() # ttml projects add_subdirectory(sources)