2

我需要将一个缓冲区的内容以n字节块(n可能会有所不同)复制到另一个缓冲区,多次检查缓存性能。

我使用 memcpy,但恐怕我没有得到成功的结果。块大小从几千字节到几兆字节不等。而且我必须保留要使用的最大块(长双)。

我有点迷失在副本中。我只是想知道是否有人遇到过这个问题,并且可以帮助我提供一些提示或伪代码。

我编辑主题以包含一些代码:

int main (int argc, char *argv[])
{
    FILE *fp;
    fp= fopen("part1.dat", "w");
    struct timeval time, oldtime;
    float segundos, microsegundos, total;
    //        float rendimiento;    
    pid_t pid;
    struct sched_param parametros;
    int i, v,p;
    char buffer1[100024];
    char buffer2[100024];

    pid = getpid();
    parametros.sched_priority = sched_get_priority_max(SCHED_FIFO);
    sched_setscheduler(pid, SCHED_FIFO, &parametros);
    p=0;

    gettimeofday(&oldtime, NULL);

    for (i=1;i<65;i++)
    {
        size_t datos=i*1024;
        for (v=0; p>i;v++)
        {
             memcpy(buffer1, buffer2, datos);
             p=(MAX_SIZE/i*1024);

        }
    }

    gettimeofday(&time, NULL);
    segundos = (float) (time.tv_sec - oldtime.tv_sec);
    microsegundos = (float) (time.tv_usec - oldtime.tv_usec);
    total = (float) ((segundos * 1000000 + microsegundos));


    //            printf ("Dimension %d \t Tiempo 1: %.2f \t Fallos Metodo 1:%d \t Tiempo 2: %.2f \t Fallos Metodo 2:%d \t Multiplica: %f \t Rendimiento: %.2f\n", i, total, fallos1, total2, fallos2, iteraciones, rendimiento);
    //              fprintf (fp, "%d \t %.3f %.3f %.3f\n", i, total, total2,rendimiento);


    fclose(fp);
    printf("Se ha creado el archivo de datos: part1.dat\n");

    return(0);
}

这个想法是从缓冲区1复制到缓冲区2,在datos块'p'次中,在这种情况下应该完成256000次(i = 1,datos = 1024)。

4

2 回答 2

2

代码有问题 - 内部 for() 循环不会执行。您正在将 p 初始化为零

p = 0;

然后循环条件比较 p > i,其中 i 的范围从 1 到 64。

for (i=1;i<65;i++)
{
   size_t datos=i*1024;
   for (v=0; p>i;v++)
   {
      .....

所以 memcpy() 从来没有真正被调用过......

你还说:

这个想法是从缓冲区1复制到缓冲区2,在datos块'p'次中,在这种情况下应该完成256000次(i = 1,datos = 1024)。

memcpy() 将目标数组作为第一个参数,将源作为第二个参数。你的参数是倒退的。

于 2009-12-16T16:26:38.703 回答
1

您可能不应该使用memcpy()它,因为您不知道它在内部是如何起作用的。例如,它可能会乱序地触摸内存,这可能会使您的测量结果变得奇怪。它当然会被认为是做“最好的事情”,但你的任务似乎暗示你不在乎。:)

因此,只需使用直接复制循环,可能首先舍入非对齐访问(这memcpy()很可能已经做了另一件事)。

此外,您不能使用非整数类型(例如double. 你应该使用size_t.

于 2009-12-16T12:32:57.557 回答