相关疑难解决方法(0)

超级队列和行填充缓冲区的语义是什么?

我问这个关于 Haswell 微架构(英特尔至强 E5-2640-v3 CPU)的问题。从CPU和其他资源的规格我发现有10个LFB,超级队列的大小是16。我有两个关于LFB和SuperQueue的问题:

1) 系统可以提供的最大内存级并行度是多少,10 还是 16(LFB 或 SQ)?

2)根据某些来源,每个 L1D 未命中都记录在 SQ 中,然后 SQ 分配行填充缓冲区,而在其他某些来源中,他们写道 SQ 和 LFB 可以独立工作。你能简单解释一下 SQ 的工作吗?

这是 SQ 和 LFB 的示例图(不适用于 Haswell)。 在此处输入图片说明 参考资料:https : //www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-optimization-manual.pdf

http://www.realworldtech.com/haswell-cpu/

architecture memory x86 caching intel

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

简单的()循环基准测试与任何循环绑定需要相同的时间

我愿意编写一个代码,让我的CPU执行一些操作,看看他花了多少时间来解决它们.我想做一个从i = 0到i <5000的循环,然后将i乘以一个常数和时间.我最终得到了这个代码,它没有错误,但即使我更改循环i <49058349083或者如果i <2它需要相同的时间,它只需要0.024秒来执行代码.是什么错误?

PD:我昨天开始学习C++我很抱歉,如果这是一个非常容易回答的问题,但我找不到解决方案

#include <iostream>
#include <ctime>

using namespace std;

int main () {
    int start_s=clock();

    int i;
    for(i=0;i<5000;i++){
        i*434243;
    }

    int stop_s=clock();
    cout << "time: "<< (stop_s-start_s)/double(CLOCKS_PER_SEC)*1000;

    return 0;
}
Run Code Online (Sandbox Code Playgroud)

c++ performance benchmarking microbenchmark

5
推荐指数
2
解决办法
568
查看次数

为什么clang用-O0生成效率低的asm(对于这个简单的浮点和)?

我在llvm clang Apple LLVM 8.0.0版(clang-800.0.42.1)上反汇编代码:

int main() {
    float a=0.151234;
    float b=0.2;
    float c=a+b;
    printf("%f", c);
}
Run Code Online (Sandbox Code Playgroud)

我编译时没有-O规范,但我也试过-O0(给出相同)和-O2(实际上计算值并存储它预先计算)

产生的反汇编如下(我删除了不相关的部分)

->  0x100000f30 <+0>:  pushq  %rbp
    0x100000f31 <+1>:  movq   %rsp, %rbp
    0x100000f34 <+4>:  subq   $0x10, %rsp
    0x100000f38 <+8>:  leaq   0x6d(%rip), %rdi       
    0x100000f3f <+15>: movss  0x5d(%rip), %xmm0           
    0x100000f47 <+23>: movss  0x59(%rip), %xmm1        
    0x100000f4f <+31>: movss  %xmm1, -0x4(%rbp)  
    0x100000f54 <+36>: movss  %xmm0, -0x8(%rbp)
    0x100000f59 <+41>: movss  -0x4(%rbp), %xmm0         
    0x100000f5e <+46>: addss  -0x8(%rbp), %xmm0
    0x100000f63 <+51>: movss  %xmm0, -0xc(%rbp)
    ...
Run Code Online (Sandbox Code Playgroud)

显然它正在做以下事情:

  1. 将两个浮点数加载到寄存器xmm0和xmm1上
  2. 把它们放在堆栈中
  3. 从堆栈加载一个值(不是之前的xmm0)到xmm0
  4. 执行添加. …

c assembly x86-64 compiler-optimization llvm-codegen

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

为什么"#pragma omp simd"在gcc编译器下只能在"-O2"中获得很大的性能提升?

检查以下代码:

#include <stdio.h>
#include <omp.h>

#define ARRAY_SIZE  (1024)
float A[ARRAY_SIZE];
float B[ARRAY_SIZE];
float C[ARRAY_SIZE];

int main(void)
{   
    for (int i = 0; i < ARRAY_SIZE; i++)
    {
        A[i] = i * 2.3;
        B[i] = i + 4.6;
    }

    double start = omp_get_wtime();
    for (int loop = 0; loop < 1000000; loop++)
    {
        #pragma omp simd
        for (int i = 0; i < ARRAY_SIZE; i++)
        {
            C[i] = A[i] * B[i];
        }
    }
    double end = omp_get_wtime();
    printf("Work consumed %f seconds\n", …
Run Code Online (Sandbox Code Playgroud)

performance gcc simd openmp auto-vectorization

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

添加冗余分配可在编译时加速代码而无需优化

我发现了一个有趣的现象:

#include<stdio.h>
#include<time.h>

int main() {
    int p, q;
    clock_t s,e;
    s=clock();
    for(int i = 1; i < 1000; i++){
        for(int j = 1; j < 1000; j++){
            for(int k = 1; k < 1000; k++){
                p = i + j * k;
                q = p;  //Removing this line can increase running time.
            }
        }
    }
    e = clock();
    double t = (double)(e - s) / CLOCKS_PER_SEC;
    printf("%lf\n", t);
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

我在i5-5257U Mac OS上使用GCC 7.3.0来编译代码 …

performance x86 assembly

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

有关strlen不同实现的性能的问题

我已经实现了strlen()以不同的方式,包括功能SSE2 assemblySSE4.2 assembly并且SSE2 intrinsic,我也产生了一些实验,请用strlen() in <string.h>strlen() in glibc。但是,以毫秒(时间)为单位的性能是出乎意料的。

我的实验环境: CentOS 7.0 + gcc 4.8.5 + Intel Xeon

以下是我的实现:

  1. strlen 使用SSE2程序集

    long strlen_sse2_asm(const char* src){
    long result = 0;
    asm(
        "movl %1, %%edi\n\t"
        "movl $-0x10, %%eax\n\t"
        "pxor %%xmm0, %%xmm0\n\t"
        "lloop:\n\t"
            "addl $0x10, %%eax\n\t"
            "movdqu (%%edi,%%eax), %%xmm1\n\t"
            "pcmpeqb %%xmm0, %%xmm1\n\t"
            "pmovmskb %%xmm1, %%ecx\n\t"
            "test %%ecx, %%ecx\n\t"
            "jz lloop\n\t"
    
        "bsf %%ecx, %%ecx\n\t"
        "addl %%ecx, %%eax\n\t"
        "movl %%eax, %0"
        :"=r"(result)
        :"r"(src)
        :"%eax" …
    Run Code Online (Sandbox Code Playgroud)

performance gcc sse inline-assembly intrinsics

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

在C++中推荐的++或+1是什么?

S++或者S=S+1,可以建议将值增加1,为什么?

我认为S++应该是首选,因为它是内部的单机指令(INC).如果我错了,请让我纠正.其他方式我认为两者都是相同的,除了++是一元的,它的后增量和运算符重载都是不同的.

C#会有什么不同吗?

c# c++ visual-c++ c++11

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

gcc可以让我的代码并行吗?

我想知道gcc中是否存在可以使某些单线程代码(如下例)并行执行的优化.如果不是,为什么?如果是,可以进行哪种优化?

#include <iostream>

int main(int argc, char *argv[])
{
    int array[10];
    for(int i = 0; i < 10; ++ i){
        array[i] = 0;
    }
    for(int i = 0; i < 10; ++ i){
        array[i] += 2;
    }
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

添加:

感谢OpenMP链接,并且我认为它很有用,我的问题与编译相同的代码有关,而无需重写smth.所以基本上我想知道是否:

  1. 使代码并行(至少在某些情况下)而不重写代码是可能的吗?
  2. 如果是,可以处理哪些案件?如果没有,为什么?

c++ optimization gcc

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

绩效评估的惯用方法?

我正在评估我的项目的网络+渲染工作负载。

程序连续运行一个主循环:

while (true) {
   doSomething()
   drawSomething()
   doSomething2()
   sendSomething()
}
Run Code Online (Sandbox Code Playgroud)

主循环每秒运行 60 多次。

我想查看性能故障,每个程序需要多少时间。

我担心的是,如果我打印每个程序的每个入口和出口的时间间隔,

这会导致巨大的性能开销。

我很好奇什么是衡量性能的惯用方法。

日志打印是否足够好?

benchmarking microbenchmark

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

没有编译器优化的 SSE 内在函数

我是 SSE 内在函数的新手,并尝试通过它来优化我的代码。这是我的程序,用于计算等于给定值的数组元素。

我将代码更改为 SSE 版本,但速度几乎没有改变。我想知道我是否以错误的方式使用SSE......

此代码用于不允许我们启用编译器优化选项的分配。

无 SSE 版本:

int get_freq(const float* matrix, float value) {

    int freq = 0;

    for (ssize_t i = start; i < end; i++) {
        if (fabsf(matrix[i] - value) <= FLT_EPSILON) {
            freq++;
        }
    }

    return freq;
}
Run Code Online (Sandbox Code Playgroud)

上交所版本:

#include <immintrin.h>
#include <math.h>
#include <float.h>

#define GETLOAD(n) __m128 load##n = _mm_load_ps(&matrix[i + 4 * n])
#define GETEQU(n) __m128 check##n = _mm_and_ps(_mm_cmpeq_ps(load##n, value), and_value)
#define GETCOUNT(n) count = _mm_add_ps(count, check##n)

    int get_freq(const float* matrix, float …
Run Code Online (Sandbox Code Playgroud)

c sse simd compiler-optimization

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