Помогите с копией между буферами используя memcpy C - PullRequest
2 голосов
/ 16 декабря 2009

Мне нужно скопировать содержимое одного буфера в другой блоками 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);
}

Идея состоит в том, чтобы скопировать из buffer1 в buffer2, в блоках данных 'p' раз, в этом случае предполагается, что это делается 256000 раз (i = 1, datos = 1024).

Ответы [ 2 ]

2 голосов
/ 16 декабря 2009

Проблема с кодом - внутренний цикл for () не будет выполнен. Вы инициализируете р в ноль

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 () никогда не вызывается ...

Вы также сказали:

Идея состоит в том, чтобы скопировать из buffer1 в buffer2, в блоках данных 'p' раз, в это дело должно быть сделано 256000 раз (i = 1, datos = 1024).

memcpy () принимает массив назначения в качестве первого аргумента, а источник - в качестве второго. Ваши параметры задом наперед.

1 голос
/ 16 декабря 2009

Вы, вероятно, не должны использовать memcpy() для этого, так как вы не знаете, как это действует внутри. Например, это может привести к потере памяти, что может сделать ваши измерения странными. Конечно, можно предположить, что это «самое лучшее», но ваша задача, похоже, подразумевает, что вам все равно. :)

Так что просто используйте прямой цикл копирования, возможно, сначала закруглите невыровненный доступ (что, скорее всего, memcpy() уже делает).

Кроме того, вы не можете измерить размеры блоков памяти, используя нецелочисленный тип, такой как double. Вы должны использовать size_t.

...