【发布时间】:2021-01-04 10:57:55
【问题描述】:
我得到了hold on an SUPER-FAST algorithm,它统一生成一个随机字节数组。比标准库的 c++ 均匀分布和 mersenne-twister 快 6 倍。
数组的计数可以被 4 整除,因此可以解释为整数数组。将每个条目转换为整数,会产生[INT_MIN, INT_MAX] 范围内的值。但是如何将这些整数值转换为介于我自己的 [min, maximum] 之间?
我想避免任何 if-else,以避免分支。
也许我应该应用一些按位逻辑来丢弃每个数字中不相关的位? (因为所有剩余的未屏蔽位无论如何都是 0 或 1)。如果我可以提取最大值中的最高有效位,我可以在我的整数中屏蔽任何比该位更重要的位。
例如,如果我希望我的 max 为 17,那么它是二进制形式的 00010001。也许我的面具会看起来像00011111?然后我可以将其应用于数组中的所有数字。
但是,这个掩码是错误的......它实际上允许值高达(1+2+4+8+16) :(
我能做什么?还有,min怎么保养?
编辑
我的应用程序的每一帧都为神经网络生成数百万个数字。我设法使用 AXV2 对浮点变量的代码进行矢量化(使用 this post),但也需要让整数工作。
【问题讨论】:
-
您使用的是哪个 C++ 版本?值是否保证为正?
-
既然你用的是C++,why not using C++?
-
如果
min和max不是 2 的幂,我猜位掩码没用。 -
在
[min, max]中生成一个随机数,相当于在[0,max-min]中生成一个随机数,然后加上min。这减少了在[0,max]中生成数字的问题。如果max的形式为2^n-1,那么您可以切断多余的位。但如果不是,则没有算法可以在[0,max]中从01统一生成器生成随机数,这样结果是统一的并且它具有停止属性。还要忘记避免分支。 -
典型的解决方案是
rand() % max,这是不统一的。另一个是do { result = rand(); } while (result > max),它是统一的,但没有停止属性。如果我没记错的话,即使预期的迭代次数大约是 6。
标签: c++ bit-manipulation simd avx2