clang/gcc是否有办法执行英特尔icc所做的#pragma forceinline recursive事情或与之相近的事情?
Run Code Online (Sandbox Code Playgroud)#pragma forceinline [recursive]指定语句中所有调用的内联.
该
forceinlinepragma表示只要编译器能够这样做,就应该内联所讨论的调用.
recursive表示该pragma适用于这些调用在调用链中递归调用的所有调用这些是特定于语句的内联编译指示.每个都可以放在C/C++语句之前,然后应用于语句中的所有调用以及嵌套在该语句中的语句中的所有调用.
(https://software.intel.com/en-us/node/524498)
我宁愿不使用,__attribute__((always_inline))因为它适用于功能.在我的情况下,功能并不是很小.我想让编译器在大多数情况下确定何时内联它.此外,虽然这个属性很强,但它仍然不是" 永远 ".更改全局选项(如内联深度和大小限制)也不理想.
但是,在某些特定情况下,我知道内联函数可以对性能产生很大影响(在我的情况下,系数为2).英特尔#pragma inline/forceinline [recursive]适用于个人陈述,具有我想要的效果.GCC或clang是否有任何类似的东西只会影响函数的特定调用站点?
我有一个高度优化的函数,在内循环中重复调用,用 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) 考虑以下三个项目。
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.txtlibb.cppProjectA (git子模块)
CMakeLists.txtliba.cpp和ProjectB的CMakeLists.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。它取决于ProjectA和ProjectB。并假设我不知道该ProjectB依赖关系ProjectA已经存在(例如,我之前没有创建过这两个ProjectC依赖关系。或者认为实际上有很多依赖关系,因此我不会被迫找出其中的确切依赖关系树)。
无论如何,我都将ProjectA和ProjectB作为git子模块添加到中ProjectC。因此,它具有以下结构,
ProjectC
CMakeLists.txtlibc.cppProjectA (git子模块)
CMakeLists.txtliba.cppProjectB (git子模块)
CMakeLists.txtlibb.cppProjectA(子模块的git子模块ProjectB)
CMakeLists.txtliba.cpp并且具有以下内容CMakeLists.txt。
cmake_minimum_required(VERSION …Run Code Online (Sandbox Code Playgroud) 有没有办法有选择地禁用 clang-tidy 警告。例如,我readability-identifier-naming启用了检查,并且还通过header-filter. 检查所有方法是否采用驼峰命名法。然而,有时有些类会直接替换另一个 STD 类或 Boost 类,因此它们具有小写命名约定。在这种情况下,clang-tidy 会发出很多警告。有没有办法针对特定代码段禁用它们。// clang-format off与clang-format的效果类似// clang-format on。