相关疑难解决方法(0)

最快的固定长度6 int数组

回答另一个Stack Overflow问题(这个)我偶然发现了一个有趣的子问题.排序6个整数数组的最快方法是什么?

由于问题是非常低的水平:

  • 我们不能假设库可用(并且调用本身有它的成本),只有普通的C.
  • 避免排空指令流水线(具有非常高的成本),我们也许应该尽量减少分支机构,跳跃,和所有其他类型的控制流断裂的(像那些隐藏在背后的序列点&&||).
  • 房间受限制,最小化寄存器和内存使用是一个问题,理想情况下,排序可能是最好的.

真的这个问题是一种高尔夫,其目标不是最小化源长度而是执行时间.我把它叫做"Zening"代码在本书的标题中的代码优化禅迈克尔·亚伯拉什及其续集.

至于为什么它很有趣,有几个层次:

  • 这个例子很简单,易于理解和衡量,并没有太多的C技能
  • 它显示了为问题选择好算法的效果,以及编译器和底层硬件的效果.

这是我的参考(天真的,未优化的)实现和我的测试集.

#include <stdio.h>

static __inline__ int sort6(int * d){

    char j, i, imin;
    int tmp;
    for (j = 0 ; j < 5 ; j++){
        imin = j;
        for (i = j + 1; i < 6 ; i++){
            if (d[i] < d[imin]){
                imin = i;
            }
        }
        tmp = d[j];
        d[j] = d[imin];
        d[imin] = …
Run Code Online (Sandbox Code Playgroud)

sorting algorithm optimization gpgpu sorting-network

396
推荐指数
11
解决办法
7万
查看次数

L1和L2缓存的行大小

从以前的问题,在这个论坛上,我了解到,在大多数存储系统中,L1缓存L2缓存的子集,是指从L2删除任何条目也从L1删除.

所以现在我的问题是如何在L1缓存中为L2缓​​存中的条目确定相应的条目.存储在L2条目中的唯一信息是标签信息.根据此标记信息,如果我重新创建addr,如果L1和L2缓存的行大小不相同,它可能会跨越L1缓存中的多行.

该体系结构是否真的打扰了两条线路,或者它只是保持具有相同线路大小的L1和L2缓存.

我知道这是一个政策决定,但我想知道常用的技术.

caching memory-management computer-architecture

64
推荐指数
3
解决办法
8万
查看次数

在不使用条件语句和三元运算符的情况下,在C中最多找到三个数字

我必须找到最多由用户提供的三个号码,但有一些限制.不允许使用任何条件声明.我尝试使用下面的三元运算符.

max=(a>b?a:b)>c?(a>b?a:b):c
Run Code Online (Sandbox Code Playgroud)

但它再次限制使用三元运算符.现在我不知道该怎么做?

c algorithm conditional-statements

30
推荐指数
4
解决办法
5万
查看次数