小编fc6*_*c67的帖子

矢量化代码时缓存未命中数增加

我在SSE 4.2和AVX 2的2个向量之间矢量化了点积,如下所示.该代码使用GCC 4.8.4和-O2优化标志进行编译.正如预期的那样,两者的性能都有所提高(和AVX 2比SSE 4.2快),但是当我用PAPI分析代码时,我发现未命中的总数(主要是L1和L2)增加了很多:

没有矢量化:

PAPI_L1_TCM: 784,112,091
PAPI_L2_TCM: 195,315,365
PAPI_L3_TCM: 79,362
Run Code Online (Sandbox Code Playgroud)

使用SSE 4.2:

PAPI_L1_TCM: 1,024,234,171
PAPI_L2_TCM: 311,541,918
PAPI_L3_TCM: 68,842
Run Code Online (Sandbox Code Playgroud)

使用AVX 2:

PAPI_L1_TCM: 2,719,959,741
PAPI_L2_TCM: 1,459,375,105
PAPI_L3_TCM: 108,140
Run Code Online (Sandbox Code Playgroud)

我的代码可能有问题或者这种行为是否正常?

AVX 2代码:

double vec_dotProduct(const vec& vecs, const unsigned int& start_a, const unsigned int& start_b, const int& n) {
    double dot = 0;
    register int i = 0;
    const int loopBound = n-3;

    __m256d vsum, vecPi, vecCi, vecQCi;

    vsum = _mm256_set1_pd(0);

    double * const pA = vecs.x+start_a ;
    double * const …
Run Code Online (Sandbox Code Playgroud)

c++ profiling caching vectorization papi

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

OpenMP任务计划策略

我想知道如何执行OpenMP任务队列的任务调度。

在这里,我了解到,默认情况下,OpenMP强制采用广度优先的调度程序,并且它们对FIFO与LIFO进行了一些测试,但是它们没有说明默认值。由于我只有一个线程(我使用单个指令)来创建多个任务,因此比较它们的广度优先与工作优先的调度没有任何意义。

那么,默认的FIFO还是LIFO?可以更改吗?

谢谢

parallel-processing scheduled-tasks task openmp

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

使用GMP精确损失

我有一个程序,从字符串中读取数字到mpz_t,然后将其转换为mpf_t.尽管从文件中正确读取,但是当我将它们转换为mpf_t时会出现精度损失.代码如下:

#include <gmp.h>
#include <stdlib.h>
#include <stdio.h>

int main (int argc, char **argv) {
    char* str = "632512364206354367378453";
    mpz_t x;

    mpz_init_set_str(x, str, 10);

    mpf_t a;
    mpf_init(a);
    mpf_set_z(a, x);
    gmp_printf("mpz_t: %Zd\n", x);
    gmp_printf("mpf_t: %Ff\n", a);
}
Run Code Online (Sandbox Code Playgroud)

此示例的输出是:

mpz_t: 632512364206354367378453
mpf_t: 632512364206354367378000.000000
Run Code Online (Sandbox Code Playgroud)

如您所见,最后3位数字不正确.我怎么能避免这个?还有其他功能可以执行此转换吗?

谢谢

c c++ precision gmp floating-point-precision

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

如何获得10的幂的尾数和指数?

我看到了函数double frexp (double x, int* exp);,它将一个double分为尾数(m)和指数(e),幂为2(1.m * 2^e).是否有类似的函数以10的幂返回值?像是m * 10^e完美的东西.

c floating-point double double-precision

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

转换长多长双

我试图将长长矩阵的第一行转换为long double,但是当我打印结果时它只打印0.这是功能:

void convertLLtoLD(long long **B, long double **C, int n){
    int i, j;
    for (i = 0; i < n; i++) {
        for (j = 0; j < n; j++) {
            C[i][j] = 0;
        }
    }

    for (i = 0; i < n; i++) {
        C[0][i] = B[0][i]; //C[0][i] = (long double)B[0][i];
    }
    for(i = 0; i < n; i++)
        printf("%lf ", C[0][i]);
}
Run Code Online (Sandbox Code Playgroud)

这是我在调用函数之前分配C的代码:

long double** C = (long double**)malloc(n * sizeof(long double*));

for (i = 0; i …
Run Code Online (Sandbox Code Playgroud)

c c++ type-conversion

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