在使用32位或64位处理器的计算机中,为什么不使用40位或其他数字?

问题描述 投票:1回答:2

例如,对于32位处理器,一个字长4字节。也可以使用5字节字或其他字吗?

32bit-64bit cpu-architecture rationale word-size
2个回答
0
投票

从历史上看,有几台计算机的字长不等于2的幂,如Table of word sizes所示。但是,最终人们发现,当地址大小为2的幂时,地址算法更容易实现。

考虑诸如“向前跳14个字”的操作。如果字长为2的幂,即64,则电路需要将数字14移位log(64)/log(2)=6并加到ip,这可以很容易地在1个周期内完成。但是,如果单词大小是36(例如在IBM 701中),那么数字14必须乘以36,这将需要更多的周期。鉴于将整数乘以字长是一种很常见的操作,因此减慢速度将非常显着。


0
投票

是否也可以使用5字节字或其他字

是。您甚至可以通过bit fields仅使用几位而不是整个字节/字。从技术上讲,编译器可以支持任何体系结构上的任何整数大小,例如16位计算机上的12位,30位或96位int。

为什么不是40位或其他数字?

性能将受到很多。我们需要更多说明来处理非本地整数大小。如果大小小于一个字,则编译器需要发出按位指令以掩盖其余位。相反,我们需要多个指令来处理多个单词

[另一重要是misalignment。当变量的地址是其大小的倍数或至少是数据总线宽度/字长的倍数时,现代CPU的工作效率更高。使用奇数大小的变量很尴尬


也就是说,存在许多具有40位类型的32位体系结构,例如TI C6000TI C5500 DSP

long

  • 40位或5个字节用于C6000 COFF

[...]和C5500具有40位long long

C89 Support in TI Compilers

这是因为这些DSP具有特殊的40位累加器,可以将32位数字相加256次而不会溢出。但是,为什么不只使用64位累加器呢?这将需要更大的ALU,需要更多的功率并运行得更慢(因为更大的面积意味着硬件组件之间的距离更长,并且与较小的组件相比,大量组件的运行要慢),这在为性能而设计的DSP中是不可接受的(可能还有电源)

...例如,德州仪器(TI)TMS320C6000,一种DSP处理器,使用32位代表类型int,使用40位代表类型long(这种选择并不罕见)。那些使用24位表示类型int的处理器(通常是DSP),通常使用48位表示类型long。在32/64位整数类型表示不符合成本效益的情况下,可以由应用程序要求使用24/48位整数类型表示形式。

The New C Standard (Excerpted material): An Economic and Cultural Commentary

实际上,DSP中40位int非常普遍(其他示例为BlackfinSHARC)。 SHARC甚至具有80位累加器,因此您可以添加很多64位值,而不必担心溢出]


但是您不需要特殊的DSP。如果确实需要,您仍然可以使用40位变量,例如,当您使用巨大的数组时,其中64位整数会使它太大而无法容纳在主内存中,而更少的项将适合缓存。最简单的方法是禁用#pragma pack__attribute__((packed))的对齐方式

struct int40_t {
    int64_t : 40;
} __attribute__((packed));
int40_t myArray[200] __attribute__((packed));

或从简单的char数组访问值(基于cmm's solution

unsigned char _5byteInts[5*size+3];  // +3 avoids overfetch of last element

int64_t get5byteInt(size_t index)
{
    int64_t v = 0;
    memcpy(&v, &_5byteInts[index*5], 5);        // little endian
    return (v << 24) >> 24;
}

void set5byteInt(size_t index, int64_t value)
{
    memcpy(&_5byteInts[index*5], &value, 5);    // little endian
}

但是这些将导致在没有不对齐访问的情况下架构性能下降。您可以将四个40位int打包到单个20字节结构中,以获得更好的对齐方式

struct four_int40s {
    uint32_t low[4];
    uint8_t hi[4];
};

有关更多信息,请阅读

© www.soinside.com 2019 - 2024. All rights reserved.