这是一个边缘话题。因为我想了解编程、CPU 缓存、读取 CPU 缓存行等,所以我把它贴在这里。
我在 C/C++ 中实现了 AES 算法。由于在没有硬件支持的情况下执行 GF(2 8 ) 乘法在计算上是昂贵的,我已经优化为使用 AES S-box 的查找表。但不幸的是,基于查找表的实现容易受到缓存定时攻击。因此,由于对 CPU 缓存非常天真,我开始学习它的工作原理,以及如何在不增加任何计算成本的情况下规避这种攻击。
我意识到实际上有 AES NI 指令和 Bit Slice AES 实现,但它们远远超出了我目前的理解。
我从 crypto.SE 了解到,最简单的方法是在查找之前读取所有缓存行或读取整个表。(这也影响了我的表现)但是我不知道如何在软件中实现它,或者它背后的复杂概念。
在OpenSSLaes-x86core.c
的C 实现参考指南中—— 作者实现了一个功能:
static void prefetch256(const void *table)
{
volatile unsigned long *t=(void *)table,ret;
unsigned long sum;
int i;
/* 32 is common least cache-line size */
for (sum=0,i=0;i<256/sizeof(t[0]);i+=32/sizeof(t[0])) sum ^= t[i];
ret = sum;
}
Run Code Online (Sandbox Code Playgroud)
for
循环i
中增加8 …
我正在致力于创建 Mandelbrot 集的深度缩放,您可能知道 OpenGL ES 不支持该double
数据类型。它可以提供的最高精度是 IEEE 754 的精度float
。在谷歌搜索上,经过大量搜索后,我发现了这个博客: https: //blog.cyclemap.link/2011-06-09-glsl-part2-emu/,它完全致力于这个主题。但是,不幸的是我无法理解那里提供的加法、减法和乘法的代码。特别是,我无法理解处理纠错和携带的部分。如果您能向我解释错误检查的深度以及从低位部分到较高部分的位转移,那将非常有帮助。到目前为止,我只了解将双精度数拆分为两个浮点数的基本概念。但是,我不清楚基本操作的实施。如果使用二进制数的上下文来完成解释,将会非常有帮助。
我尝试了许多用于渲染曼德尔布罗特集的算法,包括朴素的逃逸时间算法,以及优化的逃逸时间算法。但是,是否有更快的算法可以像我们在 YouTube 上看到的那样有效地产生真正深度的缩放。另外,我很想了解一些关于如何提高 C/C++ 之外的精度的想法 double
c ×2
c++ ×1
cpu-cache ×1
glsl ×1
graphics ×1
mandelbrot ×1
opengl-es ×1
optimization ×1
volatile ×1