我想知道缓存行大小以及写入数组时修补的大小是多少?

时间:2012-03-22 15:33:38

标签: c

我想在线程之间实现优化队列。为了提高性能,我想通过拆分队列大小来使用管道技术。

我有一个很大的队列,用于两个线程之间的通信,一个叫做producer,另一个叫做consumer。通过分割队列大小,如果生产者在队列的一部分中写入,则消费者可以读取由生产者写入的部分。当消费者正在读取队列的一部分时,制作者可以在另一部分中写作。

但我认为当缓存读取数组(因为队列是由数组构成)时,大小与缓存行大小不同。

所以我想知道缓存带来数组写入或读取数据的大小。

1 个答案:

答案 0 :(得分:1)

如果您在Linux上运行,此信息有时会在/proc/cpuinfo中列为cache_alignment

您也可以通过逐步调整数组,调整步幅和定时循环来间接找到此信息。当访问不是块对齐时,您将看到性能下降,因此您可以非常了解块大小。这是一个快速而肮脏的版本基本上这样做,我认为它会给你一个好主意:

int main () {
    int i, STEP_SIZE = 8;
    int * a;
    struct timeval t1, t2;
    double el;

    a = (int*)malloc(1024*1024*64*sizeof(int));

    for (i = 0; i < 1024*1024*64; i++)
        a[i] = 0;

    gettimeofday(&t1, NULL);

    for (i = 0; i < 1024*1024*64; i += STEP_SIZE)
        a[i] += 10;

    gettimeofday(&t2, NULL);
    el = (t2.tv_sec - t1.tv_sec) * 1000.0;
    el += (t2.tv_usec - t1.tv_usec) / 1000.0;
    printf("%d %3.2f\n", STEP_SIZE, el);

    return 0;
}

基本上你想改变STEP_SIZE