-1
a = sbrk(20*1024*1024+8192);
        a=(int *)((((int)a>>13)<<13)+8192);
    gettimeofday(&start,NULL);
    ARRAY_SIZE = 20*1024*1024+8192;
    for (times=0; times<SOME_LARGE_NUMBER; times++){
            for (i=0; i<ARRAY_SIZE; i=i+SOME_ACCESS_SIZE){
                         dummy=a[i];
                 }
    } 

どうやら、上記のコードに対して浮動小数点の例外が発生します。これは、ARRAY_SIZEが20 mbであるためです。セグメンテーション違反や浮動小数点の例外が発生しないのに、そのサイズが20mbの場合はどうすればよいですか。

4

2 に答える 2

1

いくつかの問題があります:

  • がどのようaに宣言されているかを示していないため、その型がわからず、それを含む式がどのように評価されるかを分析できません。
  • sbrk時代遅れの呼び出しです。特別な場合を除き、malloc代わりに使用する必要があります。
  • このステートメントは、8192 バイトの倍数a=(int *)((((int)a>>13)<<13)+8192);に揃えようとしますがa、少なくとも.uintptr_tint
  • への引数sbrkはバイト数ですが、(int *)キャストが示すaのは へのポインタintです。いずれにせよ、割り当てに を掛ける必要がありますsizeof *a
  • が 8192 バイトの倍数に整列された後は、その一部が整列に使用されているため、その後に使用できるバイトaはなくなります。20*1024*1024+8192YetARRAY_SIZEが設定20*1024*1024+8192され、ループ内で使用されるため、配列が確実にオーバーランします。おそらく、ARRAY_SIZEに設定する必要があります20*1024*1024
于 2012-12-12T02:12:08.240 に答える
0

20*1024*1024+8192 バイト長のメモリ ブロックを割り当て、それを20*1024*1024+8192 intsの配列として扱っています。代わりに次のことを試してください。

ARRAY_SIZE = (20*1024*1024+8192) / sizeof(int);
于 2012-12-12T02:12:03.660 に答える