我正在尝试测量平均访问延迟(以纳秒为单位),但在第一次迭代后我得到“Segmentation fault(core dumped)”。我错过了什么吗?我误用了指针吗? 这是导致错误的函数:
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <stdint.h>
#include <inttypes.h>
inline uint64_t as_nanoseconds(struct timespec* ts)
{
return ts->tv_sec * (uint64_t)1000000000L + ts->tv_nsec;
}
double measure(size_t sizes, uint32_t distance, size_t num_iter, size_t num_rep)
{
uint32_t *array;
array = malloc(sizes * sizeof(uint32_t));
int x = sizes / distance;
uint32_t *array_2;
array_2 = malloc(x * sizeof(uint32_t));
for (uint32_t i = 0; i < x; i++) {
array_2[i] = i;
}
for (size_t i = 0; i < sizes; i++) {
array[i] = 0;
}
for (size_t i = 0; i < x - 1; i++) {
array[array_2[i] * distance] = array_2[i + 1] * distance;
}
array[array_2[x - 1] * distance] = array_2[0] * distance;
double *measurements;
measurements = malloc(num_rep * sizeof(uint32_t));
uint64_t accu_nsec = 0;
struct timespec start;
struct timespec stop;
for (size_t run = 0; run < num_rep; ++run) {
volatile uint32_t next_offset = 0;
clock_gettime(CLOCK_REALTIME, &start);
for (size_t i = 0; i < num_iter / 1000; ++i) {
for (int x = 0; x < 1000; x++)
next_offset = array[next_offset];
}
clock_gettime(CLOCK_REALTIME, &stop);
accu_nsec += as_nanoseconds(&stop) - as_nanoseconds(&start);
double latency_per_access = (double)accu_nsec / num_iter;
measurements[run] = latency_per_access;
}
double AVG_LPA;
for (int i = 0; i < num_rep; i++)
AVG_LPA = +measurements[i];
return AVG_LPA / num_rep;
}
答案 0 :(得分:1)
下面:
double *measurements;
measurements = malloc(num_rep * sizeof(uint32_t));
应该是
double *measurements;
measurements = malloc(num_rep * sizeof(double));
我也怀疑这个
double AVG_LPA;
for (int i = 0; i < num_rep; i++)
AVG_LPA = +measurements[i];
没有按你的想法行事。也许
double AVG_LPA = 0.0;
for (int i = 0; i < num_rep; i++)
AVG_LPA += measurements[i];