我在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) 我想知道如何执行OpenMP任务队列的任务调度。
在这里,我了解到,默认情况下,OpenMP强制采用广度优先的调度程序,并且它们对FIFO与LIFO进行了一些测试,但是它们没有说明默认值。由于我只有一个线程(我使用单个指令)来创建多个任务,因此比较它们的广度优先与工作优先的调度没有任何意义。
那么,默认的FIFO还是LIFO?可以更改吗?
谢谢
我有一个程序,从字符串中读取数字到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位数字不正确.我怎么能避免这个?还有其他功能可以执行此转换吗?
谢谢
我看到了函数double frexp (double x, int* exp);,它将一个double分为尾数(m)和指数(e),幂为2(1.m * 2^e).是否有类似的函数以10的幂返回值?像是m * 10^e完美的东西.
我试图将长长矩阵的第一行转换为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)