我应该在将字符数组作为32进行访问之前对齐它们
我需要非常快地将不可压缩数据生成任意大小的字符数组。 因此,由于性能差,不能使用诸如Mersenne Twister的良好的随机数生成器算法。 我也排除了C标准库随机数生成器函数,因为它们不是内联函数,所以调用开销太高,而且它们也不是线程安全的。 我选择了数字配方线性同余发生器(a = 1664525,c = 1013904223,参见http://en.wikipedia.org/wiki/Linear_congruential_generator)作为随机数发生器。
现在,RNG生成32位随机数,但该数组是8位字符数组。 我可以做位移和掩码来将一个32位随机数字转换为四个8位随机数字,但这太慢了。 因此,我真的需要以32位整型数组的形式访问8位字符数组。
我有下面的循环(或者实际上,我有它的展开版本,然后是它的未展开版本,然后是最后一个循环,以便在sz不能被4整除的情况下生成8位随机数):
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)在x86 / AMD64处理器上,未对齐的访问可能太慢。 但是,我使用x86处理器上的未对齐数组测试了该程序,并且它并不比使用对齐数组慢,所以潜在效果(2)似乎不适用。 但是,(1)在RISC架构上仍然如此。 我现在无法访问任何RISC机器来测试这种机器如何失效。
我应该添加一个循环来产生少量的8位整数,以使32位访问始终保持一致? 我担心这个循环会降低性能,同时对x86 / AMD64处理器没有任何好处。 我们不打算在非x86 / AMD64处理器上运行该软件。
此外,该函数的实际当前用例正在调用它由malloc()返回的缓冲区,它应该无论如何对齐。 但有人,有一天理论上可能会滥用RISC处理器上的功能,将其称为未对齐的阵列。 取决于处理器架构的这种滥用的结果可能是灾难性的。
如果有方法可以快速生成不可压缩的数据,比使用数字配方随机数生成器和以32位int数组访问8位字符数组的方法更好,那么也可以回答。 请注意,该程序也应该在32位体系结构上快速运行,因此建议64位随机数生成器不会更好。
您是否听说过PGC系列发生器,该算法非常简单,并且具有很好的熵。 谈话描述发电机的视频。
这也比简单的LCG更好。
回答
我最近偶然发现了这篇文章,因为我对缓存对齐的影响有同样的担忧。 这表明在特定情况下访问未对齐的数据可能会对性能产生重大影响。
链接地址: http://www.djcxy.com/p/54087.html上一篇: Should I align a character array before accessing it as 32
下一篇: Why does compiler align N byte data types on N byte boundaries?