小编Mys*_*ial的帖子

C++:将64位整数与32位整数进行比较是否安全?

假设我有2个变量:

uint64_t a = ...

uint32_t b = ...
Run Code Online (Sandbox Code Playgroud)

比较整数会产生预期的结果,即(a != b),或(b > a)

c++

17
推荐指数
2
解决办法
2422
查看次数

ADD 1真的比INC快吗?86

我已经阅读了各种优化指南,声称ADD 1比在x86中使用INC更快.这是真的吗?

optimization performance x86 assembly

17
推荐指数
2
解决办法
4856
查看次数

您将如何从用户模式代码中一般性地检测缓存行关联性?

我正在为valgrind中的cachegrind/callgrind工具整理一个小补丁,它将使用完全通用的代码,CPU指令和缓存配置自动检测(现在只有x86/x64自动配置,而其他架构不提供CPUID类型配置为非特权代码).此代码需要完全在非特权上下文中执行,即纯用户模式代码.它还需要可以在非常不同的POSIX实现中移植,因此grokking/proc/cpuinfo不会这样做,因为我们的目标系统之一没有这样的东西.

检测CPU的频率,高速缓存的数量,它们的大小,甚至高速缓存行大小都可以使用100%通用POSIX代码完成,该代码没有任何特定于CPU的操作码(只是很多合理的假设,例如添加两个数字在一起,如果没有内存或寄存器依赖性停顿,可能会在一个周期内执行).这部分相当简单.

什么不是那么简单,为什么我问StackOverflow,是如何检测给定缓存的缓存行关联性?关联性是缓存中可以包含来自主内存的给定缓存行的位数.我可以看到可以检测到L1缓存关联性,但L2缓存?当然L1关联性会受到影响吗?

我很欣赏这可能是一个无法解决的问题.但我把它扔到StackOverflow上,并希望有人知道我不知道的事情.请注意,如果我们在这里失败,我将简单地以四方式的关联性默认值进行硬编码,假设它不会对结果产生巨大影响.

谢谢,
尼尔

c valgrind cpu-architecture cpu-cache

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

OpenMP和STL向量

我有一些代码,我想以下列方式使用OpenMP:

std::vector<int> v(1000);
# pragma omp parallel for
for (int i = 0; i < 1000; ++i) {
    v[i] = i;
}
Run Code Online (Sandbox Code Playgroud)

我已经读过,在多个线程写入单个容器的情况下,STL向量容器不是线程安全的,这意味着我需要在进行任何写入之前锁定向量; 但是,我也被告知上面的写操作在某种程度上是"原子的",所以上面没有竞争条件.有人可以澄清一下吗?

c++ multithreading stl vector openmp

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

-gfast对g ++做了多少额外的优化?

在g ++ 4.6(或更高版本)中,除了-ffast-math之外还有什么额外的优化功能?

手册页说这个选项"还支持对所有标准兼容程序无效的优化".我在哪里可以找到有关这是否会影响我的程序的更多信息?

c++ compiler-construction optimization performance gcc

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

15
推荐指数
2
解决办法
4952
查看次数

Java中对NaN的困惑

int i = 0, j = 0;
double nan1 = (double)0/0;
double nan2 = (double)0/0;
double nan3 = (double)i/j;
System.out.println(Double.doubleToRawLongBits(nan1) == Double.doubleToRawLongBits(nan2));
System.out.println(Double.doubleToRawLongBits(nan1) == Double.doubleToRawLongBits((double)0/0));
System.out.println(Double.doubleToRawLongBits(nan3) == Double.doubleToRawLongBits(nan2));
Run Code Online (Sandbox Code Playgroud)

输出:

true
true
false
Run Code Online (Sandbox Code Playgroud)

请帮助我输出true前两个和false最后一个的输出.请告诉我Double.doubleToRawLongBits()方法的实际工作是什么.

java floating-point double nan

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

在GCC中使用不同版本的SSE内在函数的正确方法是什么?

我举一个例子来问我的问题.现在我有一个叫做的函数do_something().

它有三个版本:do_something(),do_something_sse3(),和do_something_sse4().当我的程序运行时,它将检测CPU功能(看它是否支持SSE3或SSE4)并相应地调用三个版本之一.

问题是:当我建立我的程序与海湾合作委员会,我必须设置-msse4do_something_sse4()编译(如头文件<smmintrin.h>被包括在内).

但是,如果我设置-msse4,则允许gcc使用SSE4指令,并且一些内在函数do_something_sse3()也被转换为某些SSE4指令.因此,如果我的程序在仅支持SSE3(但没有SSE4)的CPU上运行,则在调用时会导致"非法指令" do_something_sse3().

也许我有一些不好的做法.你能提一些建议吗?谢谢.

c gcc sse intrinsics

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

c中最有效的指针算术类型

我假设当我们写:(arr[i]相当于*(arr+i))时会发生内部强制转换.因为i例如可以是一个short,intlong或任何这些三个无符号的变体.

所以我的问题很简单:哪种类型应该i不会发生内部转换?这样代码可以最有效地运行?

粗猜:size_t

c performance pointers pointer-arithmetic

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

RDTSC开销的差异

我正在构建一个微基准来测量性能变化,因为我在一些原始图像处理操作中尝试使用SIMD指令内在函数.但是,编写有用的微基准测试很困难,因此我想首先了解(如果可能的话)消除尽可能多的变异和误差源.

我必须考虑的一个因素是测量代码本身的开销.我正在使用RDTSC进行测量,我正在使用以下代码来查找测量开销:

extern inline unsigned long long __attribute__((always_inline)) rdtsc64() {
    unsigned int hi, lo;
        __asm__ __volatile__(
            "xorl %%eax, %%eax\n\t"
            "cpuid\n\t"
            "rdtsc"
        : "=a"(lo), "=d"(hi)
        : /* no inputs */
        : "rbx", "rcx");
    return ((unsigned long long)hi << 32ull) | (unsigned long long)lo;
}

unsigned int find_rdtsc_overhead() {
    const int trials = 1000000;

    std::vector<unsigned long long> times;
    times.resize(trials, 0.0);

    for (int i = 0; i < trials; ++i) {
        unsigned long long t_begin = rdtsc64();
        unsigned long long t_end = rdtsc64(); …
Run Code Online (Sandbox Code Playgroud)

c++ performance assembly intel rdtsc

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