ppu和spu之间结构大小的差异



我正在进行一些蜂窝宽带引擎编程,在调查分割故障时,我遇到了一件我无法解释的奇怪事情,基于以下代码:

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,这是预期的。

我找不出原因。有什么想法吗?

经过额外的阅读,我发现了以下内容:ppu-g++编译器似乎默认为64位,这意味着指针值将占用内存中的8个字节。这可能会导致发送到SPU程序进行DMA传输的数据值不一致。

为了防止出现这样的问题,您不应该在结构中存储指针,而应该存储一个无符号的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程序的数据的正确有效地址将是正确的,从而防止在64位PPU程序运行32位SPU程序时出现进一步的问题。

最新更新