记一下那些伪随机数生成函数
Han 通过 Google 阅读器发送给您的内容: 记一下那些伪随机数生成函数 于 13-3-27 通过 basic coder 作者:levin 今天踩了一个伪随机数生成函数的坑,与其说是个坑到不如说自己功力不够深厚,对这些随机数生成的函数族欠缺了解,先来介绍下我的问题吧。 拿了100M的数据用LDA算法来跑,单线程的时候一次迭代需要大约15s的时间,而改用两个线程跑,线程之间对不同的数据块进行迭代,一次迭代完成的时间居然需要大约50s,而且线程数越多就会越慢,因为迭代的采样函数是一个纯计算的函数,多线程的情况下每个线程的数据量要比单线程成倍地缩小,迭代速度相比单线程应该快N倍才对,现在的结果是不符合常理的,因为每个线程都是独立的训练集,线程之前没有共享数据。 其实在我用几M的小数据测试的时候就发现这个问题,当时以为是数据量小迭代速度太快,以至于在迭代完成后的线程同步占用了一些时间才导致多线程版本会慢于单线程版本,但数据量大的时候这样就不可理解了。 后来开了两个线程发现,迭代计算的时候两个CPU大部分时间居然都没有跑在用户空间,相反大量的cpu时间都耗在了系统时间,仔细看了代码,这部分就只有一个random()函数不是我的计算函数,改成定值之后测试速度马上彪上去了,那就可以断写问题就出在这里。 random()函数是不可重入的函数,不保证它是线程安全的,但我看了glibc的代码发现, 其实它在glibc的实现里面是线程安全的: long int __random ( ) { int32_t retval ; __libc_lock_lock ( lock ) ; ( void ) __random_r ( & unsafe_state , & retval ) ; __libc_lock_unlock ( lock ) ; return retval ; } weak_alias ...