在前6次迭代后获取分段错误

时间:2018-05-06 21:07:41

标签: c

我正在尝试测量平均访问延迟(以纳秒为单位),但在第一次迭代后我得到“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;
}

1 个答案:

答案 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];