【转】C代码利用CPU L1 cache一秒内算出十亿以内质数的个数

我去年发表了一篇 Python 代码+Numpy 库 + Sieve算法实现一秒内计算出一亿以内的质数的个数:

https://blog.csdn.net/Scott0902/article/details/128193368

今天在 GitHub 上找到国外牛人在三年前已经用 C 语言编写出利用 CPU L1 cache 来进行超高速计算的代码。学过计算机原理的你应该知道,CPU一级缓存的读取是最快的。别说一亿了,连十亿以内的质数个数在不到一秒内也能算出来,简直是计算性能的天花板!

源代码文件名:sieve_eratosthenes.c

需要注意的是 segmented_sieve 函数里有一个 printf 语句输出质数,运行时会不停地在屏幕打印质数,所以要把这一行注释掉,否则运行时有排等。

我在 Windows 10 使用 clang 编译成功。

运行时第一步:

必须先输入你的 CPU 的每个线程的 L1 cache 容量,单位是字节。这个数怎么找?方法有很多,Win10 自带的任务管理器有得看,或者使用专业的 CPU-Z、AIDA64 等工具查看也能快速找到。

第二步:输入范围,以十亿为例,就是 1 后面加九个零。

我试着第一步输入 131072,也就是 128KB,第二步输入十亿,计算耗时:1.434 秒。

我再试调整第一步输入值,发现 L1 cache 输入值越大,计算耗时越长,输入值越小,计算越快。

输入值为 4096 时,计算耗时最短:只有 0.816 秒,计算质数个数的结果都一样,快得令人惊掉下巴!

代码我就不贴上来了,感兴趣的朋友请移步到牛人的 GitHub 项目地址:https://github.com/TotallyNotChase/cFastSieve

猜你喜欢

转载自blog.csdn.net/Scott0902/article/details/134662294
今日推荐