c - 在将其作为 32 位 int 数组访问之前,我应该对齐字符数组吗?

标签 c arrays random memory-alignment

我需要将不可压缩的数据生成为任意大小的字符数组 真的很快。因此,好的随机数生成器算法,例如 Mersenne 由于性能不佳,无法使用 Twister。我也排除了C 标准库随机数生成器函数,因为它们不是内联的 函数,因此调用开销太高,此外,它们不是 线程安全的。我选择了 Numerical Recipes linear congruential 发电机(a = 1664525,c = 1013904223,见 http://en.wikipedia.org/wiki/Linear_congruential_generator ) 作为随机 数字生成器。

现在,RNG 生成 32 位随机数,而数组是 8 位字符 大批。我可以进行位移和掩码,将一个 32 位随机数转换为 四个 8 位随机数,但这太慢了。因此,我真的需要 将 8 位字符数组作为 32 位整数数组访问。

我有以下循环(或者实际上,我有它的展开版本 然后是它的非展开版本,然后是最终循环以生成 8 位随机数,以防 sz 不能被 4 整除):

while (off+4 <= sz)
{
    uint32_t x = randNr(&ctxlocal); // An inline function
    *(uint32_t*)(ar+off) = x;
    off += 4;
}

将 8 位字符数组作为 32 位整数数组进行访问。现在我 担心访问可能未对齐。这可能有两个影响:(1) 非 x86/AMD64 处理器,未对齐访问可能会失败,(2) on x86/AMD64 处理器,未对齐的访问可能太慢。但是,我测试了程序 在 x86 处理器上使用未对齐的数组,它并不比使用时慢 对齐数组,因此潜在影响 (2) 似乎不适用。然而,(1) 在 RISC 架构上仍然成立。我现在无法访问任何 RISC 机器来测试它在此类机器上如何失败。

我是否应该添加一个循环来生成几个 8 位整数,然后首先生成 32 位整数 访问始终对齐?我担心循环会降低性能 同时对 x86/AMD64 处理器没有任何好处。我们不打算运行 非 x86/AMD64 处理器上的软件。

此外,该函数的实际当前用例正在调用它 malloc() 返回的缓冲区,无论如何都应该对齐。但是有人, 理论上有一天可以通过调用它来滥用 RISC 处理器上的功能 未对齐的数组。这种滥用取决于处理器架构的结果可能是灾难性的。

如果有比当前使用 Numerical Recipes 随机数生成器并将 8 位 char 数组作为 32 位 int 数组访问的方法更好的快速生成不可压缩数据的方法,也可以回答。请注意,该程序也应该在 32 位架构上快速运行,因此建议使用 64 位随机数生成器并不算更好。

最佳答案

你听说过PGC Family generator吗? ,该算法非常简单,并且具有良好的熵也非常快。 video描述生成器的谈话。

这也比简单的 LCG 好得多。

回答

我最近偶然发现了 this article因为我对缓存对对齐的影响有同样的担忧。这表明在特定情况下访问未对齐的数据可能会对性能产生很大的影响

关于c - 在将其作为 32 位 int 数组访问之前,我应该对齐字符数组吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29141382/

相关文章:

c - 在 C 中验证整数

python - 如何构建加权随机列表?

Python读取麦克风

c - 将结构的大小作为 void 传递给函数

c - 可变内存位置与符号 vs pmap

c - 代码块中的标准库在哪里?

Java - 使用并行数组查找常见的频繁数字

arrays - 如何过滤结构数组?

java - 防止发生错误时强行关闭

r - 当向量长度为​​一时,R 中的 sample() 不可预测