1

私はいくつかのセル ブロードバンド エンジンのプログラミングを行っています。次のコードに基づいて、セグメンテーション違反を調査しているときに、説明できない奇妙なことに遭遇しました。

struct SPU_DATA
{
    unsigned char *i;
    unsigned char *o;
    unsigned int width;
    unsigned int height;
    unsigned int bpp;
    char padding[108];
} __attribute__((aligned(128)));

この構造体のサイズを ppu のコンソールに出力すると、256 という値が出力されます。ただし、spu でサイズを出力すると、128 と表示されます。これは予想どおりです。

私はこれの理由を見つけることができません。何か案は?

4

1 に答える 1

1

さらに読んだ後、次のことを発見しました: ppu-g++ コンパイラはデフォルトで 64 ビットに設定されているようです。これは、ポインタ値がメモリ内で 8 バイトを占有することを意味します。これにより、DMA 転送のために SPU プログラムに送信されるデータ値に矛盾が生じる可能性があります。

このような問題を防ぐには、ポインターを構造体に格納する代わりに、次のようにポインターの値を含む unsigned long long を格納する必要があります。

struct SPU_DATA
{
    unsigned long long i;
    unsigned long long o;
    unsigned int width;
    unsigned int height;
    unsigned int bpp;
    char padding[108];
} __attribute__((aligned(128)));

このようにして、ポインター値は切り捨てられず、SPU プログラムに送信されるデータの正しい有効アドレスが正しくなり、32 ビット SPU プログラムを実行する 64 ビット PPU プログラムの場合のさらなる問題を防ぎます。

于 2015-12-05T23:39:47.143 に答える