69

偽共有を防ぐために、配列の各要素をキャッシュラインに揃えたいと思います。したがって、最初にキャッシュラインのサイズを知る必要があるので、各要素にそのバイト数を割り当てます。次に、配列の先頭をキャッシュラインに揃えたいと思います。

Linuxと8コアx86プラットフォームを使用しています。まず、キャッシュラインサイズを見つけるにはどうすればよいですか。次に、Cでキャッシュラインに合わせるにはどうすればよいですか。gccコンパイラを使用しています。

したがって、たとえば、キャッシュラインサイズを64とすると、構造は次のようになります。

element[0] occupies bytes 0-63
element[1] occupies bytes 64-127
element[2] occupies bytes 128-191

当然のことながら、0-63がキャッシュラインにアラインされていると仮定します。

4

7 に答える 7

94

Linuxと8コアx86プラットフォームを使用しています。まず、キャッシュラインサイズを見つけるにはどうすればよいですか。

$ getconf LEVEL1_DCACHE_LINESIZE
64

値をマクロ定義としてコンパイラーに渡します。

$ gcc -DLEVEL1_DCACHE_LINESIZE=`getconf LEVEL1_DCACHE_LINESIZE` ...

実行時sysconf(_SC_LEVEL1_DCACHE_LINESIZE)に、L1キャッシュサイズを取得するために使用できます。

于 2011-09-02T14:24:19.050 に答える
40

サイズを知るには、プロセッサのドキュメントを使用して調べる必要があります。プログラムでそれを行う方法はありません。ただし、プラス面として、ほとんどのキャッシュラインは、Intel標準に基づく標準サイズです。x86のキャッシュラインは64バイトですが、偽共有を防ぐために、ターゲットとするプロセッサのガイドラインに従う必要があります(インテルには、ネットバーストベースのプロセッサに関する特別な注意事項があります)。通常、このために64バイトに調整する必要があります。 (Intelは、16バイトの境界を越えることも避けるべきだと述べています)。

CまたはC++でこれを行うには、標準関数、またはまたはなどのコンパイラ固有の指定子の1つを使用する必要がありaligned_allocます。構造体のメンバー間を埋めて異なるキャッシュラインに分割するには、次の64バイトの境界に揃えるのに十分な大きさのメンバーを挿入する必要があります__attribute__((align(64)))__declspec(align(64))

于 2011-09-02T09:50:52.420 に答える
13

もう1つの簡単な方法は、/ proc/cpuinfoを単にcatすることです。

grep cache_alignment /proc/cpuinfo
于 2012-06-02T07:17:00.343 に答える
9

キャッシュラインのサイズを取得するための完全に移植可能な方法はありません。ただし、x86 / 64を使用している場合は、cpuid命令を呼び出して、サイズ、キャッシュラインサイズ、レベル数など、キャッシュについて知っておく必要のあるすべてのものを取得できます。

http://softpixel.com/~cwright/programming/simd/cpuid.php

(少し下にスクロールすると、ページはSIMDに関するものですが、キャッシュラインを取得するセクションがあります。)

データ構造の調整に関しては、完全に移植可能な方法もありません。GCCとVS10には、構造体の配置を指定する方法が異なります。「ハッキング」する1つの方法は、必要な配置に一致するまで、構造体に未使用の変数を埋め込むことです。

mallocs()を整列させるために、すべての主流コンパイラーもその目的のためにmalloc関数を整列させています。

于 2011-09-02T14:52:34.033 に答える
8

posix_memalignまたはvallocを使用して、割り当てられたメモリをキャッシュラインに揃えることができます。

于 2011-09-02T09:56:06.327 に答える
3

これが私が作成したテーブルで、ほとんどのArm/Intelプロセッサが搭載されています。定数を定義する際の参照に使用できます。これにより、すべてのアーキテクチャのキャッシュラインサイズを一般化する必要がなくなります。

C ++の場合、うまくいけば、この情報を取得するための正確な方法となるハードウェアインターフェイスのサイズがすぐにわかります(コンパイラにターゲットアーキテクチャを指示すると仮定します)。

于 2019-11-29T11:36:40.343 に答える
2

C ++でこれを簡単に行う方法に興味がある場合は、オブジェクトを呼び出すことによって参照される、キャッシュラインサイズとオブジェクトの配置の決定を処理するクラスを使用してライブラリを構築しましCacheAligned<T>た。キャッシュラインのサイズが事前にわかっている場合や、非常に一般的な値である64(バイト)を維持したい場合にも使用できます。T.Ref()CacheAligned<T>Aligned<typename T, size_t Alignment>

https://github.com/NickStrupat/Aligned

于 2015-01-23T06:22:17.973 に答える