小编Tho*_*ser的帖子

如何在CMake中生成器或输入更改时仅构建自动生成的代码?

我正在开发一个源代码存储库,它通过运行python脚本输出头文件和实现来生成一些C++代码.随后编译此代码并将其链接到我的库和可执行文件.我知道只有在两个条件之一为真时生成的代码才会改变:

  1. 生成器代码本身也在变化
  2. 生成器的输入(XML文件)发生变化

我想使用cmake来管理构建过程.目前,我正在使用execute_process火力发电机.但是,每次运行cmake时都会运行它并触及文件,导致生成的代码被重新编译并添加到我的总编译时间.

我还想确保生成的代码始终在我的库之前运行.换句话说,我希望库依赖于生成器运行.

在cmake中处理这种情况的正确方法是什么?我已经看到了之前的答案:" 在构建库之前,让CMake在项目中执行目标 ".但这取决于事先已知的代码生成器的输出.我的代码生成器将生成可变数量的文件.

c++ build cmake

18
推荐指数
1
解决办法
8413
查看次数

用于旋转或转置阵列的最佳SIMD算法

我正在研究一个数据结构,我有一个16 uint64的数组.它们在内存中的布局如下(每个下面代表一个int64):

A0 A1 A2 A3 B0 B1 B2 B3 C0 C1 C2 C3 D0 D1 D2 D3
Run Code Online (Sandbox Code Playgroud)

期望的结果是将数组转换为:

A0 B0 C0 D0 A1 B1 C1 D1 A2 B2 C2 D2 A3 B3 C3 D3
Run Code Online (Sandbox Code Playgroud)

阵列旋转90度也是未来循环的可接受解决方案:

D0 C0 B0 A0 D1 C1 B1 A1 D2 C2 B2 A2 D3 C3 B3 A3
Run Code Online (Sandbox Code Playgroud)

我需要这个以便稍后快速操作箭头(按顺序遍历另一个SIMD行程,一次4个).

到目前为止,我试图通过加载A的4 x 64位向量,比特掩码和混洗元素并用B等进行OR运算来"混合"数据,然后对C进行重复...不幸的是,这是数组中4个元素的每个段的5 x 4个SIMD指令(一个加载,一个掩码,一个shuffle,一个或下一个元素,最后一个存储).看来我应该能够做得更好.

我有AVX2可用,我用clang编译.

assembly transpose intel simd avx2

8
推荐指数
1
解决办法
1542
查看次数

在GCC,Clang和英特尔编译器中强制内联一个宏?

我有一个函数,我需要在C++ 11的紧密循环中内联

我希望函数在头文件的单独文件中实现,并且仍然强制它在所使用的任何地方内联.另外,我想用clang,GCC和英特尔编译器进行编译.

充实要求.我正在寻找一个允许我做类似的宏:

#define force_inline <something here>
Run Code Online (Sandbox Code Playgroud)

在标题中:

force_inline void foo();
Run Code Online (Sandbox Code Playgroud)

我应该能够在实现文件中执行此操作:

void foo() {... Code.. }
Run Code Online (Sandbox Code Playgroud)

为了清楚起见,我不想把代码放在我的标题中.我希望它们只包含函数的声明.

有没有办法使用适用于所有编译器的宏来实现内联?

我到目前为止最好的解决方案是这个宏:

#define forceinline inline __attribute__((always-inline))
Run Code Online (Sandbox Code Playgroud)

似乎ICC需要两者inline(与内联代码无关)和头部中的完整实现以保证函数的内联.

PS:是的,我已经测量了我的表现,而且我知道一个事实是内联函数比没有更快.不,编译器不会为我做这件事.

c++ gcc clang icc c++11

8
推荐指数
1
解决办法
791
查看次数

是否可以检索创建WDFREQUEST的CPU?

我试图将CompleteRequest的完成关联到最初发出请求的CPU.有没有办法检索在FdoDeviceControl期间发出请求的CPU或任何另一种方式来查看请求进入调度队列之前的来源?

c windows wdk device-driver wdf

7
推荐指数
1
解决办法
195
查看次数

是否存在任何基于数组,有界,等待自由的堆栈?

我有一个问题,需要我使用高度并发,无等待的堆栈实现.我必须事先预先分配所有内存(没有垃圾收集或mallocs),并且堆栈的大小是可接受的(如果堆栈满,则push可能返回false).

我熟悉Nir Shavit的堆栈实现:http://citeseerx.ist.psu.edu/viewdoc/summary?doi = 10.1.1.156.8728 ......但这依赖于链表和垃圾收集.我需要一些基于数组的东西.

看起来ACM上有一个:http://dl.acm.org/citation.cfm? id = 1532611虽然我对低下载速率和引用持怀疑态度.

理想的答案是参考代码(在C/C++中)我可以简单地窃取:-)

algorithm stack multithreading lockless data-structures

7
推荐指数
1
解决办法
620
查看次数

有没有办法拦截KMDF中的每一个IRP

我正在编写一个KMDF驱动程序,它需要在传递给ioQueue之前拦截每个IRP.

我有一个注册PreprocessIrpCallback的回调函数,并希望将它挂钩到这样的框架中

status = WdfDeviceInitAssignWdmIrpPreprocessCallback(DeviceInit
    , PreprocessIrpCallback
    , ?
    , ?);
Run Code Online (Sandbox Code Playgroud)

但问题是,如果我想拦截每一个IRP?

windows driver kmdf

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

memcpy在编译时已知大小

我发现自己调整了一段代码,其中使用memcpy了内存,第三个参数(大小)在编译时是已知的.

函数调用的使用者memcpy执行类似于此的操作:

template <size_t S>
void foo() {
    void* dstMemory = whateverA
    void* srcMemory = whateverB
    memcpy(dstMemory, srcMemory, S) 
}
Run Code Online (Sandbox Code Playgroud)

现在,我memcpy本以为内在足够聪明才能意识到这一点:

foo<4>()
Run Code Online (Sandbox Code Playgroud)

...可以用memcpy32位整数赋值替换函数.但是,我惊讶地发现自己看到了> 2倍的加速:

template<size_t size>
inline void memcpy_fixed(void* dst, const void* src) {
    memcpy(dst, src, size);
}


template<>
inline void memcpy_fixed<4>(void* dst, const void* src) { *((uint32_t*)dst) =  *((uint32_t*)src); }
Run Code Online (Sandbox Code Playgroud)

并重写foo为:

 template <size_t S>
 void foo() {
    void* dstMemory = whateverA
    void* srcMemory = whateverB
    memcpy_fixed<S>(dstMemory, srcMemory) 
}
Run Code Online (Sandbox Code Playgroud)

两个测试都在clang(OS …

c++ performance memcpy

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

如何从模板访问模板化类的静态?

我正在尝试使用CRTP模式编写模板.我想要的是模板访问static const模板化类中的a.

我的模板在它自己的标题中看起来像这样:

template <class T> foo {
  static const int readValue = T::value
}
Run Code Online (Sandbox Code Playgroud)

我继承了这样的模板(在另一个头文件中):

class fooImpl: foo<fooImpl> {
  static const int value = 42; 
}
Run Code Online (Sandbox Code Playgroud)

然而,clang抱怨说:

'fooImpl'中没有名为'value'的成员

我想我在这里得到了鸡肉和鸡蛋的问题.模板不知道定义fooImpl,因此value在实例化时不能知道它有成员.

但是我该如何解决呢?有没有办法将const值的编译时间传播到实例化模板中?

c++ templates c++11

2
推荐指数
1
解决办法
107
查看次数

_m_test_all_zeros的__m256i版本

我知道如何使用_mm_test_all_zeros固有函数测试_m128i寄存器是否全部为零。

此内在函数的AVX2 / __ m256i版本是什么?如果一个不可用,测试SIMD寄存器中所有256位是否均为零的最快方法是什么?

simd intrinsics avx avx2

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