Tag: cpu

从C / C ++代码执行RDMSR和WRMSR指令

我需要控制C-State配置。 具体来说,我可能想执行以下asm代码: __asm { rdmsr and eax, 0x00 or eax, 0x01 wrmsr } 目前,我在rdmsr行上rdmsr了这个exception: MessWithCStates.exe中0x00e3139e处的未处理exception:0xC0000096:特权指令。 我如何(永久)提升我的应用程序的权限,以便它可以执行上面的代码? 我使用VS 2010。 注意:无需编写内核模式驱动程序即可。 见R / W Everything 。

执行__builtin_clz

GCC(4.6+)__builtin_clz的实施是什么? 它是否与Intel x86_64 (AVX)上的某些CPU指令相对应?

可编程USB加密狗

我在哪里可以购买支持C作为开发语言的可编程USB加密狗?

预取L1和L2的数据

在Agner Fog的手册“ C ++中的优化软件 ”第9.10节“大数据结构中的Cahce争论”中,他描述了当矩阵宽度等于称为临界步幅的情况时转置矩阵的问题。 在他的测试中,当宽度等于临界步幅时,L1中矩阵的成本增加40%。 如果矩阵更大并且仅适用于L2,则成本为600%! 这在表9.1中的文字中得到了很好的总结。 这与在为什么将512×512的矩阵转置比转换513×513的矩阵要慢得多一样是必不可少的。 后来他写道: 这种效果对于二级高速缓存争用而言比一级高速缓存争用强得多的原因是二级高速缓存不能一次预取多行。 所以我的问题与预取数据有关。 根据他的评论,我推断L1可以一次预取多个缓存行。 预取了多少? 据我所知,尝试编写代码来预取数据(例如使用_mm_prefetch)很少有用。 我读过的唯一例子是Prefetching Examples? 并且它只有O(10%)的改进(在某些机器上)。 Agner后来解释了这个: 原因是现代处理器由于无序执行和高级预测机制而自动预取数据。 现代微处理器能够自动预取包含具有不同步幅的多个流的常规访问模式的数据。 因此,如果可以使用固定步幅以常规模式排列数据访问,则不必显式预取数据。 那么CPU如何决定预取哪些数据,以及有哪些方法可以帮助CPU为预取做出更好的选择(例如“具有固定步幅的常规模式”)? 编辑:根据Leeor的评论,让我添加我的问题并使其更有趣。 与L1相比,为什么关键步幅对L2的影响要大得多? 编辑:我试图使用代码重现Agner Fog的表格为什么转换512×512的矩阵要比转置513×513矩阵慢得多? 我在Xeon E5 1620(Ivy Bridge)上以MSVC2013 64位版本模式运行它,它具有L1 32KB 8路,L2 256 KB 8路和L3 10MB 20路。 L1的最大矩阵大小约为90×90,L3的最大矩阵大小为256×256,L3的最大矩阵大小为1619。 Matrix Size Average Time 64×64 0.004251 0.004472 0.004412 (three times) 65×65 0.004422 0.004442 0.004632 (three […]

基于CPU周期计算的C / C ++ Linux x86_64中的分析

我正在使用以下代码来分析我的操作,以优化我的函数中的cpu周期。 static __inline__ unsigned long GetCC(void) { unsigned a, d; asm volatile(“rdtsc” : “=a” (a), “=d” (d)); return ((unsigned long)a) | (((unsigned long)d) << 32); } 我不认为这是最好的,因为即使连续两次通话也给我带来“33”的差异。 有什么建议 ?