5

私の質問は2つの部分で構成されています。

  1. cc コンパイラを使用した sparc(sun) の memalign(block_size,bytes) は、バイトが 2 の累乗であることをチェックしないことに気付きました2の累乗。

これは太陽のバグですか、パッチはありますか、それとも自分で memalign を書く必要がありますか。

  1. さらに、私は構造を持っています(私のコードではありません):

    typedef struct CLHLockStruct {
        volatile CLHLockNode CACHE_ALIGN *Tail ;
        volatile CLHLockNode CACHE_ALIGN *MyNode[N_THREADS] ;
        volatile CLHLockNode CACHE_ALIGN *MyPred[N_THREADS] ;
    } CLHLockStruct;
    

私はMVSC(ビジュアルスタジオ2008)の下でコンパイルしています:

    CACHE_LINE_SIZE = 64
    CACHE_ALIGN = __declspec(align(CACHE_LINE_SIZE)) 
    N_THREADS = 8
    sizeof(CLHLockStruct)=192

コードは最初は sparc アーキテクチャ用に書かれており、多くのコードを変更せずに MVSC に移行しようとしています。

彼らのコードでは memalign(CACHE_LINE_SIZE,sizeof(CLHLockStruct)) を使用しており、私はそれを _aligned_malloc に変更しました。私の問題は、sizeof(CLHLockStruct) が 2 のべき乗でないことです。 2 の累乗。

彼らはより良いアプローチですか?

編集1

サイズが 2 の累乗になるように、この構造体をパディングするにはどうすればよいですか?

EDIT2

_aligned_malloc および malloc のように機能する関数はありますか: block_size の倍数にアラインされたメモリ ポインターを返しますが、バイトが 2 の累乗である必要はありませんか?

4

2 に答える 2

4

彼らのコードでは memalign(CACHE_LINE_SIZE,sizeof(CLHLockStruct)) を使用しており、私はそれを _aligned_malloc に変更しました。私の問題は、sizeof(CLHLockStruct) が 2 の累乗ではないことです。

に変更しました_aligned_malloc(CACHE_LINE_SIZE,sizeof(CLHLockStruct))か?はい、それはこれを引き起こすでしょう。_aligned_mallocは最初の引数としてサイズを想定し、2 番目の引数として配置を想定しているmemalignため、引数を交換する必要があります。サイズは 2 の累乗である必要はありません。

于 2012-08-08T07:18:17.567 に答える
1

回答 1: POSIX標準では、2 の累乗システムのポインター サイズの倍数を返すようにmemalign を定義しています。ただし、blocksize パラメータが 2 の累乗である必要もあります。それはあなたのコードに当てはまりますか?この場合、Win ライブラリが POSIX に完全に準拠していない可能性もあります。

回答 2: この SO 投稿には、次の 2 の累乗を決定する方法がいくつかリストされています。これは、aligned_malloc 実装で使用できます。

回答 3:私 (より良い: Google) は、構造体を 2 の累乗の倍数にパディングすることを説明する別の投稿を見つけました。

于 2012-08-08T06:54:39.230 に答える