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 にデータ ブロック 'p' 回でコピーすることです。

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 にデータ ブロック 'p' 回でコピーすることです。

memcpy() は、宛先配列を最初の引数として受け取り、ソースを 2 番目の引数として受け取ります。パラメータが逆です。

于 2009-12-16T16:26:38.703 に答える
1

memcpy()内部でどのように動作するかがわからないため、おそらくこれを使用しないでください。たとえば、タッチ メモリの順序が正しくない可能性があり、測定値が奇妙になる可能性があります。もちろん、「最善のこと」を行うと想定されますが、あなたの仕事は気にしないことを暗示しているようです. :)

したがって、単純なコピー ループを使用して、アラインされていないアクセスを最初に丸めます (これは、memcpy()おそらく既に行われているもう 1 つのことです)。

また、 などの非整数型を使用してメモリ ブロック サイズを測定することはできませんdouble。を使用する必要がありますsize_t

于 2009-12-16T12:32:57.557 に答える