小编Yan*_*hou的帖子

GCC/Clang相当于Intel ICC#pragma forceinline递归

clang/gcc是否有办法执行英特尔icc所做的#pragma forceinline recursive事情或与之相近的事情?

#pragma forceinline [recursive]
Run Code Online (Sandbox Code Playgroud)

指定语句中所有调用的内联.

forceinlinepragma表示只要编译器能够这样做,就应该内联所讨论的调用.

recursive 表示该pragma适用于这些调用在调用链中递归调用的所有调用

这些是特定于语句的内联编译指示.每个都可以放在C/C++语句之前,然后应用于语句中的所有调用以及嵌套在该语句中的语句中的所有调用.

(https://software.intel.com/en-us/node/524498)

我宁愿不使用,__attribute__((always_inline))因为它适用于功能.在我的情况下,功能并不是很小.我想让编译器在大多数情况下确定何时内联它.此外,虽然这个属性很强,但它仍然不是" 永远 ".更改全局选项(如内联深度和大小限制)也不理想.

但是,在某些特定情况下,我知道内联函数可以对性能产生很大影响(在我的情况下,系数为2).英特尔#pragma inline/forceinline [recursive]适用于个人陈述,具有我想要的效果.GCC或clang是否有任何类似的东西只会影响函数的特定调用站点?

c c++ gcc

5
推荐指数
0
解决办法
620
查看次数

是否有可能影响 GCC/Clang/Intel ICPC XMM/YMM 寄存器分配?

我有一个高度优化的函数,在内循环中重复调用,用 SSE2/AVX2 加速编写。经过一些改进,现在我正在接近理论上的最佳性能(基于指令延迟和吞吐量)。然而,性能不太便携。问题在于有超过16个__m128i/__256i变量。当然,其中只有 16 个可以分配在寄存器中,其余的分配在堆栈中。该功能或多或少类似于以下内容,

void eval(size_t n, __m128i *rk /* other inputs */)
{
    __m128i xmmk0 = rk[0];
    // ...
    __m128i xmmk6 = rk[6];
    __m128i xmmk;

    __m128i xmmk[Rounds - 6];
    // copy rk[7] to r[Rounds] to xmmk

    while (n >= 8) {
        n -= 8;

        __m128i xmm0 = /* initialize state xmm0 */
        // do the same for xmm1 - xmm7

        // round 0
        xmm0 = /* a few instructions involving xmm0 and xmmk0 */; …
Run Code Online (Sandbox Code Playgroud)

assembly gcc clang icc intrinsics

5
推荐指数
0
解决办法
350
查看次数

CMake并使用git-submodule进行依赖项目

考虑以下三个项目。

ProjectA没有任何依赖关系,其CMakeLists.txt顶层如下所示,

cmake_minimum_required(VERSION 2.8.4)
project(A CXX)
add_library(a ${PROJECT_SOURCE_DIR}/liba.cpp)
Run Code Online (Sandbox Code Playgroud)

ProjectB取决于ProjectA,我将其添加ProjectA为git-submodule,因此其结构如下所示,

  • ProjectB
    • CMakeLists.txt
    • libb.cpp
    • ProjectA (git子模块)
      • CMakeLists.txt
      • liba.cpp

ProjectBCMakeLists.txt如下所示

cmake_minimum_required(VERSION 2.8.4)
project(B CXX)
add_subdirectory(ProjectA)
add_library(b ${PROJECT_SOURCE_DIR}/libb.cpp)
target_link_libraries(b a)
Run Code Online (Sandbox Code Playgroud)

到目前为止,还好。

现在,我们说它来了ProjectC。它取决于ProjectAProjectB。并假设我不知道该ProjectB依赖关系ProjectA已经存在(例如,我之前没有创建过这两个ProjectC依赖关系。或者认为实际上有很多依赖关系,因此我不会被迫找出其中的确切依赖关系树)。

无论如何,我都将ProjectAProjectB作为git子模块添加到中ProjectC。因此,它具有以下结构,

  • ProjectC
    • CMakeLists.txt
    • libc.cpp
    • ProjectA (git子模块)
      • CMakeLists.txt
      • liba.cpp
    • ProjectB (git子模块)
      • CMakeLists.txt
      • libb.cpp
      • ProjectA(子模块的git子模块ProjectB
        • CMakeLists.txt
        • liba.cpp

并且具有以下内容CMakeLists.txt

cmake_minimum_required(VERSION …
Run Code Online (Sandbox Code Playgroud)

cmake git-submodules

3
推荐指数
1
解决办法
3687
查看次数

有选择地禁用 clang-tidy 警告

有没有办法有选择地禁用 clang-tidy 警告。例如,我readability-identifier-naming启用了检查,并且还通过header-filter. 检查所有方法是否采用驼峰命名法。然而,有时有些类会直接替换另一个 STD 类或 Boost 类,因此它们具有小写命名约定。在这种情况下,clang-tidy 会发出很多警告。有没有办法针对特定代码段禁用它们。// clang-format off与clang-format的效果类似// clang-format on

llvm-clang

3
推荐指数
1
解决办法
6185
查看次数

标签 统计

gcc ×2

assembly ×1

c ×1

c++ ×1

clang ×1

cmake ×1

git-submodules ×1

icc ×1

intrinsics ×1

llvm-clang ×1