【问题标题】:Variance in size of struct between ppu and spuppu 和 spu 之间结构大小的差异
【发布时间】:2015-12-03 22:10:50
【问题描述】:

我正在做一些小区宽带引擎编程,在调查分段错误时遇到了一个我无法解释的奇怪事情,基于以下代码:

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 上是 64 位的?
  • 也可以是 1013 字节或任何其他值。除了char 之外,不保证类型具有特定大小或没有填充。如果您依赖特定的布局,从/到char [](反)序列化。其他任何事情都是未定义行为的秘诀。而char 也不一定是 8 位。
  • @IanYoung 很可能是这种情况。如果 sizeof(int) 为 8,那么它不能容纳 128 个字节。所以它将与另外 128 个字节对齐。
  • @Olaf 通常实现确实保证了这些事情,即使语言没有。
  • @Olaf 我错了,实现通常定义结构布局?

标签: c++ c linux ps3


【解决方案1】:

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

为了防止此类问题,您应该存储一个 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程序的数据的正确有效地址也是正确的,防止64位PPU程序运行32位SPU程序时出现进一步的问题。

【讨论】:

    猜你喜欢
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2015-05-19
    • 2010-12-03
    • 1970-01-01
    • 2015-11-21
    • 1970-01-01
    • 2013-06-23
    相关资源
    最近更新 更多