c – xorshift128的AVX / SSE版本
发布时间:2020-12-16 03:12:56 所属栏目:百科 来源:网络整理
导读:我正在努力做出最快的高质量RNG.阅读 http://xorshift.di.unimi.it/后,xorshift128似乎是一个很好的选择. C代码是 #include stdint.huint64_t s[ 2 ];uint64_t next(void) { uint64_t s1 = s[ 0 ]; const uint64_t s0 = s[ 1 ]; s[ 0 ] = s0; s1 ^= s1 23; /
我正在努力做出最快的高质量RNG.阅读
http://xorshift.di.unimi.it/后,xorshift128似乎是一个很好的选择. C代码是
#include <stdint.h> uint64_t s[ 2 ]; uint64_t next(void) { uint64_t s1 = s[ 0 ]; const uint64_t s0 = s[ 1 ]; s[ 0 ] = s0; s1 ^= s1 << 23; // a return ( s[ 1 ] = ( s1 ^ s0 ^ ( s1 >> 17 ) ^ ( s0 >> 26 ) ) ) + s0; // b,c } 我不是SSE / AVX专家,但我的CPU支持SSE4.1 / SSE4.2 / AVX / F16C / FMA3 / XOP指令.您如何使用这些代码来加速这个代码(假设你想要制造数十亿个这样的随机数),这个加速的实际预期限制是多少? 解决方法
XorShift确实是一个不错的选择.它是如此的好,这么快,需要这么少的状态,我很惊讶,看到这么少的采纳.它应该是所有平台上的标准生成器. 8年前我自己实现了,即使这样也可以产生800MB / s的随机字节.
您不能使用向量指令来加快生成单个随机数.这几个指令中的指令级并行度太少. 但是,您可以轻松加快产生N个数字,其中N是目标指令集的向量大小.只需运行N个发电机并联.保持N个发生器的状态并同时生成N个数字. 如果客户端代码一次需要一个数字,则可以保留N(或更多)个数字的缓冲区.如果缓冲区为空,则使用向量指令进行填充.如果缓冲区不为空,您只需返回下一个数字. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
相关内容
- 【转】Oracle—自定义function语法
- ruby – 错误:安装jekyll时出错:错误:无法构建gem原生扩
- 【Android UI】案例04配置控件点击效果(selector)
- applicationContext.xml 配置文件的存放位置
- 移植Cocos2D到Android平台的原理
- 使用正则表达式匹配嵌套Html标签
- PostgreSQL中timestamp相关的SQL语句
- ruby – ChefSpec不应该测试包含的食谱
- Ruby脚本Net :: SSH :: HostKeyMismatch但ssh有效
- ruby-on-rails – 无法在Ubuntu 13.04上安装rmagick gem