Tag: 计算机体系结构

关于号码表示

如何找到我所在系统的数字表示?

没有FPU的处理器中的浮点计算

是否可以在没有浮点单元的嵌入式处理器中执行浮点运算?

“数据位”容量与“开销位”大小?

我有点卡住,因为我找不到任何覆盖缓存的“数据”部分的东西,我用Google搜索的所有内容都使用缓存的地址达到了99.9%。 我被问到的问题是这样的 对比“数据位”容量和“开销位”大小之间的差异 对于两个缓存。 我不想要答案,所以我不会发布实际的设置大小,什么不是,我只是寻找一个方向可能是一个网站或解释如何“对比”两个。 任何可能的帮助都非常感谢!

为什么这段代码不能线性扩展?

我写了这个SOR求解器代码。 不要太费心这个算法做什么,这不是关注点。 但仅仅为了完整性:它可以解决线性方程组,这取决于系统的条件有多好。 我用一个病态的2097152行sparce矩阵(从不收敛)运行它,每行最多7个非零列。 翻译:外部do-while循环将执行10000次迭代(我传递的值为max_iters ),中间将执行2097152次迭代,拆分为work_line块,在OpenMP线程之间划分。 最里面的for循环将有7次迭代,除非极少数情况下(小于1%)它可以更少。 sol数组中的线程之间存在数据依赖性。 中间的每次迭代都会更新一个元素,但最多可读取数组的其他6个元素。 由于SOR不是一个精确的算法,在读取时,它可以具有该位置上的任何先前值或当前值(如果您熟悉求解器,这是一个Gauss-Siedel,在某些地方容忍Jacobi行为,为了并行)。 typedef struct{ size_t size; unsigned int *col_buffer; unsigned int *row_jumper; real *elements; } Mat; int work_line; // Assumes there are no null elements on main diagonal unsigned int solve(const Mat* matrix, const real *rhs, real *sol, real sor_omega, unsigned int max_iters, real tolerance) { real […]

缓存内存如何工作?

今天,当我在计算机组织课上时,老师谈到了一些有趣的事情。 谈到为什么缓存有效时,他说: for (i=0; i<M; i++) for(j=0; j<N; j++) X[i][j] = X[i][j] + K; //X is double(8 bytes) 用第二行改变第一行是不好的。 你对此有何看法? 为什么会这样?

是否存在导致50%分支预测未命中的代码?

问题: 我试图找出如何编写代码(C优先,仅在没有其他解决方案的情况下 ASM),这将使分支预测在50%的情况下失败 。 所以它必须是一段代码“对于与分支相关的编译器优化”是“imune”的,并且所有HW分支预测都不应该优于50%(掷硬币)。 即使是更大的挑战,也能够在多个CPU架构上运行代码并获得相同的50%缺失率。 我设法编写了一个在x86平台上达到47%分支未命中率的代码。 我怀疑失踪可能有3%来自: 已经分支的程序启动开销(尽管很小) Profiler开销 – 基本上对于每个计数器读取都会引发中断,因此可能会添加其他可预测的分支。 在后台运行的系统调用包含循环和可预测的分支 我编写了自己的随机数生成器,以避免调用rand,其实现可能隐藏了可预测的分支。 当可用时它也可以使用rdrand 。 延迟对我来说无关紧要。 问题: 我能比我的代码版做得更好吗? 更好的意思是为所有CPU架构获得更高的分支错误预测和相同的结果。 这段代码可以预测吗? 那是什么意思? 代码: #include #include #define RDRAND #define LCG_A 1103515245 #define LCG_C 22345 #define LCG_M 2147483648 #define ULL64 unsigned long long ULL64 generated; ULL64 rand_lcg(ULL64 seed) { #ifdef RDRAND ULL64 result = 0; asm volatile […]

有什么内存地址空间?

使用了什么forms的内存地址空间? 今天,大型扁平虚拟地址空间很常见。 从历史上看,已经使用了更复杂的地址空间,例如一对基地址和偏移量,一对段号和一个偏移量,一个字地址加上一个字节或其他子对象的索引,依此类推。 有时,各种答案和评论断言C / C ++指针本质上是整数。 这是一个不正确的C / C ++模型,因为各种地址空间无疑是一些关于指针操作的C规则的原因。 例如,不在数组之外定义指针算法简化了对基本和偏移模型中指针的支持。 指针转换的限制简化了对地址加额外数据模型的支持。 这种反复出现的断言激发了这个问题。 我正在寻找有关各种地址空间的信息,以说明C / C ++指针不一定是一个简单的整数,并且考虑到要支持的各种机器,C / C ++对指针操作的限制是明智的。 有用的信息可能包括: 具有各种地址空间和这些空间的描述的计算机体系结构的示例。 在当前正在制造的机器中仍在使用的各种地址空间的示例。 引用文档或解释,尤其是URL。 详细说明地址空间如何激发C / C ++指针规则。 这是一个广泛的问题,所以我愿意接受有关管理它的建议。 我很乐意看到一个通用包容性答案的协作编辑。 然而,这可能无法授予应得的声誉。 我建议投票多个有用的贡献。