gpt4 book ai didi

c++ - 将随机整数转换为范围 [min,max] 而不进行分支

转载 作者:行者123 更新时间:2023-12-03 10:05:30 25 4
gpt4 key购买 nike

我收到了 hold on an SUPER-FAST algorithm均匀地生成一个随机字节数组。它比标准库的 c++ 均匀分布和梅森扭曲器快 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 )对代码进行矢量化,但也需要使整数工作。

最佳答案

But how can I transform these integer values to lie between my own [min, maximum]?


由于范围可能不是 2 的幂,位掩码已过时,但您已经发现了。
Modulo 也出来了,它不作为 AVX2 中的 native 操作存在(即使它存在,也不一定会使其高效)。
还有一个选项:乘高,使用 _mm256_mul_epu32 (不幸的是,对于 32 位数字,没有“纯”乘法高位,就像 16 位数字一样,所以我们被困在一个只能做 50% 有用工作的操作上)。那里的想法是采用输入数字 x (全范围)和所需范围 r ,然后计算 r * x / 2^32其中除法是隐式的(通过取乘积的上半部分来实现)。 x / 2^32如果将其解释为有理数乘以 r,则它会是 [0.0 .. 1.0) 中的数字(不包括 1.0)然后将范围扩展为 [0.0 .. r ) (不包括 r )。这不是它的计算方式,但这就是公式的来源。
通过添加 min 可以轻松设置范围的最小值。到缩放的结果。
在代码中(稍微测试):
__m256i squish(__m256i x, int min, int max) {
__m256i sizeOfRange = _mm256_set1_epi32((unsigned)max - min);
__m256i scaled_even = _mm256_shuffle_epi32(_mm256_mul_epu32(x, sizeOfRange), 0xB1);
__m256i scaled_odd = _mm256_mul_epu32(_mm256_shuffle_epi32(x, 0xB1), sizeOfRange);
__m256i scaled = _mm256_blend_epi32(scaled_even, scaled_odd, 0xAA);
return _mm256_add_epi32(scaled, _mm256_set1_epi32(min));
}
它仍然是一个专有范围,无法处理完整的 [INT_MIN .. INT_MAX]作为输出范围。连指定都没有办法,最多就是 [INT_MIN .. INT_MAX) (或例如具有零偏移量的等效范围: [0 .. -1) )。
它也不是很均匀,出于同样的原因,简单的基于模的范围缩减并不是真正均匀的,你只是不能公平地划分 N弹珠以上 K垃圾箱,除非 K碰巧分了 N均匀。

关于c++ - 将随机整数转换为范围 [min,max] 而不进行分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/65561520/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com