n****1 发帖数: 1136 | 1 你见过dart编出来的js长啥样么? 见过emscripten编出的js啥样么? 都是SSA式代码,
啥类型都没有.
汇编就那么几个operator, 几个寄存器, 可以等价于任何语言的一个只有+/x/and/or运
算的子集.
dart/emscripten不过是把语言全部编译成js中只包括数字的那个子集, 然后由v8机械
地转化成真正的汇编语言而已. 真不知道你们得汇编和微机原理咋学的. |
|
Y**G 发帖数: 1089 | 2 x86上return xxx就是将xxx放到寄存器EAX。调用者看EAX来获得函数的返回值。
如果没有return语句等于执行隐含的return语句,返回值无定义,是垃圾。 |
|
s****u 发帖数: 1433 | 3 哎,跟谁叫板也不能不顾物理原理啊。
没秒500万次,也就是5MHZ
也就是说5GHZ的CPU只能对每个请求进行1000次底层操作。
也就是1000行机器码。
比如,指把一个32位数据从地址A移到寄存器B,这就是一个底层
操作了,需要一行机器码来执行。
这1000行里面要接受通讯信息,在多个数据链表中进行查找,
插入,修改数据库,等等等等。随便那个功能都是上万行机器码
才能实现的。我这里OS等OVERHEAD都还没有算。
那脚趾头想想都知道不靠谱啊。 |
|
g****t 发帖数: 31659 | 4 我经常要看几十兆的数据,各寄存器值,各RAM值 vs 时间的图。
请问大家看这种图,一般用什么工具?
谁能推荐个能看图,能支持行列计算的简便工具?
现在都大数据时代了。看图工具的最前沿是哪家公司?
thx a lot |
|
n*****t 发帖数: 22014 | 5 来自主题: Programming版 - 简单就是美 另外,补充一下我的算法,跟大家探讨:
#define T0102 1
#define T0103 2
....
#define T0120 190
初始化的时候,将每张票按 from to enqueue,queue 中是否有票,建 bitmap。
queue[T0102], queue[T0103] .... queue[T0120]
给定 from to,需要查询的队列优先级是固定的:
queue_to_check[T0305] = { T0305, T0306, T0205 ...T0120}
bitmap[T0305] = { 0, 0, 1}
需要查询的时候:
1、检查 bitmap,最多 190 个 bit
for (i=0; i<3; i++)
if (bitmap[i] != 0) found();
2、bitmap[i] 中找到最高位为 1 的,然后比较 32 bit,16, 8 bit
, 3 次比较,都在寄存器里,最后是 7 次循环找到那个 bit
所以最坏情况:3 memory read, 10 reg comp
缺陷:一个 queue 的有票/... 阅读全帖 |
|
s****a 发帖数: 238 | 6 感觉即使用了move语义还是不如模板表达式,遇到A=B+C+D这种情况还是要生成临时对
象,只不过只要生成一次。而且模板表达式是把所有操作一次做完,中间变量放寄存器
,move语义就算覆盖不要的对象还是要访问一次内存。 |
|
S*A 发帖数: 7142 | 7 如果是说 section, 而且是举例有一个编译器就可以,
不需要有通用性,那还可以说一下。因为这些 section
定位的确是 implementation defined. 不同编译器不
一样。
很多 C 编译器是可以指定 section 的。例如 GCC
和常见的嵌入的编译器。但是这个不是通用的 C
的标准部分。Linux 里面有一小段实模式的代码,
里面还有指定绝对地址的指针呢。C 是可以当高级
汇编用的,基本上汇编能干的 C 都可以干。大不了
嵌入汇编什么的。
如果对内存的位置很关心,一般在非嵌入系统比较
常见的做法是自己 mmap。通用的变量其实是不应该
太讲究在什么内存上跑。编译器完全有可能把变量
影射到寄存器上,连地址都没有。
GCC 里面有个 linker script, xxx.lds,这个指定不同
的 section 连接以后到什么具体地址的游戏规则。一
般不是搞嵌入或者自己写 bootloader 的不太需要去
碰那个东西。 |
|
S*A 发帖数: 7142 | 8 local 那些变量有可能被优化直接去掉(dead code)。
或者直接分派到寄存器上,没有到 memory.
例如你的 c,p1,p3 等等。
特别是如果地址被只是用来做过 load/store,
没有传给其他地方的变量。 |
|
s********k 发帖数: 6180 | 9 优化掉确实有可能,假设这些code在别处都有用,什么情况分配寄存器? |
|
S*A 发帖数: 7142 | 10 p1, p2 还是可以被优化到寄存器,因为除了 load/store 没有干过其他事。
如果你用过 &p1, &p2, 那就不容易被优化掉。 |
|
z********0 发帖数: 9013 | 11 直接说你想干嘛把?别总想把Compiler骗过去,这年头不容易骗了
C语言,全局变量总会在内存里的,用到的时候会Load到寄存器,但早晚总会写回去的
,当然了,多线程下是不安全的。 |
|
w****w 发帖数: 521 | 12 为什么不能multitasking?不就是把寄存器存了,把栈指针换一下? |
|
|
|
d******e 发帖数: 2265 | 15 就是两个寄存器的数据进行减法。
如果最高位是1那么就是<。
如果是零,并且结果不为零则为>。 |
|
S*A 发帖数: 7142 | 16 没有到一一对应的地步。有很多机器码是没有 C 对应的东西的。
C 的变量需要分配到寄存器,有时候会 spill。
但是 C 很容易翻译到机器码是真的。C 可以当高级汇编用。
不需要 Lisp talk to 硬件,只是说实现一般的运算逻辑不可能
和 C 的运行效率高。假设都是非常好的程序员写的。 |
|
S*A 发帖数: 7142 | 17 C 里面变量不一定有地址,变量可以优化掉直接放到寄存器里面。 |
|
o**o 发帖数: 3964 | 18 哪位大牛说说FP的好处?
我看来看去没太明白好在哪里。第一,可以理解以函数的形式封装功能。但是很多情况
下,全面FP似乎是个不必要的制约。往往函数写的极其丑陋,因为要把一些不相干的东
西返回到同一个界面上。函数内部中间结果不能重用也是个头疼的问题。第二,从数学
上讲,变量很显然是个很重要的概念,让思维和语言有了寄存器。变量被错用,应该是
编译器分析解决的问题,可是FP放弃变量这个概念。。究竟获得了什么呢? |
|
o**o 发帖数: 3964 | 19 哪位大牛说说FP的好处?
我看来看去没太明白好在哪里。第一,可以理解以函数的形式封装功能。但是很多情况
下,全面FP似乎是个不必要的制约。往往函数写的极其丑陋,因为要把一些不相干的东
西返回到同一个界面上。函数内部中间结果不能重用也是个头疼的问题。第二,从数学
上讲,变量很显然是个很重要的概念,让思维和语言有了寄存器。变量被错用,应该是
编译器分析解决的问题,可是FP放弃变量这个概念。。究竟获得了什么呢? |
|
S*A 发帖数: 7142 | 20 基本没有可能,要搞 OS 这类的,FP 离硬件太远
不容易操作。Linux arch 下面有不少 assemblely
代码的。例如进来个 Interrupt,你要切换一大堆
寄存器之类的,FP 的运行环境都要重新设立。
C 也一样,不过 C 依赖的环境很接近硬件,很小
段汇编代码就可以进入 C 代码了。
你要是拿 FP 做这些就是找虐。 |
|
n*******7 发帖数: 181 | 21 是指dependency的处理吧。编指令时若能将任务发散到不相关的资源(寄存器等)上,
就能最优化效率。高并发也应该类似。
:我还真想不到高并发怎么能和编译原理揉到一起去,请指教.
:【 在 NeverLearn (24K golden bear) 的大作中提到: 】 |
|
s****a 发帖数: 238 | 22 所有的作业就是写一个compiler for a toy language,词法分析和语法分析都是用现成
的工具,类型检查和代码生成要自己写,但是都有框架给你。目标机器是stack
machine所以基本上没有寄存器分配问题。没有涉及优化,虽然课上有提到。 |
|
S*A 发帖数: 7142 | 23
volatile 在你的 reader process 是需要的。
不然compiler 不知道那个地址的memory会自己被另外一个
process update. 可能会 cache memory 里面的内容。
volatile 告诉 compiler 每次读这个内存都要老老实实
load,不要分配到寄存器。
不是 update to date 一定会发生的,因为是两个不同
process。等你的 reader 读到这个数据,还没有来得及
进行判断的时候,这个数据就可能已经被另外 process
update 了。也就是说,你拿到的数据永远有可能是 outdate
的。除非你在 reader process 上面 lock critical
section。
这个 race condition 一定会有,你的程序要可以对付。 |
|
h*i 发帖数: 3446 | 24 来自主题: Programming版 - 关于变量 数学的变量与计算机语言的变量不同。数学的变量更抽象,是真的变量。而计算机语言
的变量是假的,其实还是属性,是某个内存地址或者寄存器的属性。
一个非程序员A,第一次编程,看到变量,会很疑惑,比如我当年,“这是什么东西的
的变量啊”, variable for what? 后来明白了,原来就是一个地址可以存不同的东西啊
,明白了。指针?这不是很明显么,就是地址啊,有什么难的?
另一个非程序员B,第一次编程,看到变量,说,哦,我知道,数学上小学就学了的,
变量就是数学上的变量啊,懂了。结果看到指针,panic了,数学上没有指针啊,what
the fuck is a pointer?
人和人的思维方式不一样,从对数学的态度可以看出。有的人,比如冯诺伊曼,说“
You don't need to *understand* mathematics, you just get used to it". 这种人
就是上面的非程序员B。这些人成为数学家的话,一般会成为分析学家。中国培养出的
职业数学家,大多是分析学家,比如张益唐之类,解决问题能力很强,一般不自己发明
理论。
另外一些人,比如Groth... 阅读全帖 |
|
s******u 发帖数: 501 | 25 不知道你们板子定制到什么程度,大多数的情况下可以直接用linux自己的GPIO/I2C驱
动,在编译kernel的时候把这些选项打开,然后就可以直接从user space来读写这些接
口了
如果是特制的硬件,不能用自带的驱动的话,可能就需要自己写一个简单的kernel
module了。其实无非也就是寄存器读写,内存映射,同时提供mmap之类的,写起来也不
麻烦 |
|
s******u 发帖数: 501 | 26 FPGA+ARM SoC?
Xillinx的我没用过,不过最近用过一些altera的类似FPGA+ARM板子
一般来说你需要别人做好的一个kernel的branch,里面有标准的配置文件,板子的
device tree文件等等。加上一个arm的cross compiler就可以build一个kernel出来了
,顺便加加减减一些用得上用不上的module,比方说I2C什么的。
SPI和I2c相对简单,绝大多数soc都有标准的实现和相应的linux驱动,所以你只要照例
子写个c程序就可以按地址读写RTC或者显示模块了,用不着自己写驱动
soc端的gpio需要看情况,至少我用的altera是给了gpio的驱动的。
另外还有个可能是你们把所有的接口放在FPGA一端来完成,这样子你可能需要写个跟
FPGA通讯的驱动程序,或者通过mmap把寄存器映射到userspace来操作。
当然对写程序来说如果能直接写个userspace的app肯定比写kernel module要来的方便
。这里有个问题,如果你的程序要求很高的实时性的话恐怕最好还是写个kernel
module比较好,userspace的... 阅读全帖 |
|
|
k******t 发帖数: 1498 | 28 看你写什么了。写firmware的时候要是一天能写200行,调试完不出问题我做梦都笑醒。
经常性的一天只有几十行,挪个寄存器都要翻半天手册。 |
|
c*********e 发帖数: 16335 | 29 对呀。比如oracle,汇编语言直接和cpu,寄存器打交道,atom那是能保证的。真不知道
为啥有人用mysql的时候,先要lock了table,然后再用sql.第一次见到。 |
|
v****e 发帖数: 145 | 30 问题是12306自己说解决方法就是用了gemfire,从硬盘数据库改成了内存数据库,这个
话题还有什么好讨论的。。。如果系统都可以朝更第一层挖掘潜力,那不用在这里讨论
了,直接用寄存器存储数据好了。 |
|
b***i 发帖数: 3043 | 31 PLC没有磁盘,只有内存来供客户端提取数据,包括压强,温度的数据,同时,客户可
能也读取时间戳。PLC有一个RTC,关机也会运行。不过,这个PLC在当地安装后不会移
动。
从客户的角度来考虑,似乎他们只需要当地时间。有的客户所在地有夏令时,有的没有
。配置的时候,基本上是当地人配置,就是距离很近,不会需要从其他国家配置。如果
从其他国家配置,这个时区的问题就麻烦大了。
现在看来,我们这个领域的客户还没有意识到时区在时间戳里的作用,所以在设计
Modbus寄存器表的时候没有时区这个信息,他们只按排了年月日时分秒这些参数。那么
,似乎我们改动软件只配置这些就可行。
但是,如果客户有夏令时,他们的客户端PC可能会改时间, 时间不对怎么办?这个我
们以前的嵌入式系统就是没考虑这个事情,时间随时让客户改。就是说,如果夏令时到
了,他们就把小时改一下即可。那样,从Modbus读的小时就和PC又对上了。 |
|
h*i 发帖数: 3446 | 32 觉得变量不是难点的小孩,属于学不求甚解那种。不是说不好,不适合搞技术。
我的旧文:
数学的变量与计算机语言的变量不同。数学的变量更抽象,是真的变量。而计算机语言
的变量是假的,其实还是属性,是某个内存地址或者寄存器的属性。
一个非程序员A,第一次编程,看到变量,会很疑惑,比如我当年,“这是什么东西的
的变量啊”, variable for what? 后来明白了,原来就是一个地址可以存不同的东西啊
,明白了。指针?这不是很明显么,就是地址啊,有什么难的?
另一个非程序员B,第一次编程,看到变量,说,哦,我知道,数学上小学就学了的,
变量就是数学上的变量啊,懂了。结果看到指针,panic了,数学上没有指针啊,
到底什么是指针啊?
人和人的思维方式不一样,从对数学的态度可以看出。有的人,比如冯诺伊曼,说“
You don't need to *understand* mathematics, you just get used to it". 这种人
就是上面的非程序员B。这些人成为数学家的话,一般会成为分析学家。中国培养出的
职业数学家,大多是分析学家,比如张益唐之类,解决问题能力很强,... 阅读全帖 |
|
h**********c 发帖数: 4120 | 33 lock应该是通过CPU的特殊寄存器实现一段代码的atomicity,多个server不知道是不是
lock,你不怕慢,就用 MYSQL 搞个transactional counter,同步的核心就是TCP那套,
握手,校验,sliding window. |
|
w****e 发帖数: 1883 | 34 同意。试过各种distributed lock,最后发现用database最可靠。略微牺牲一点性能,
但是对于web来说一般没啥问题。
:lock应该是通过CPU的特殊寄存器实现一段代码的atomicity,多个server不知道是不是
:lock,你不怕慢,就用 MYSQL 搞个transactional counter,同步的核心就是TCP那套,
:握手,校验,sliding window. |
|
c*******v 发帖数: 2599 | 35 Continuation 你怎么看?我觉得如果放在imperative language 或者汇编背景下,就
是goto/jmp,加上stack和寄存器的快照。
这个东西很多地方吹,是因为
FP的计算模型实现汇编机器的功能比较难?如果不关心
FP语法和imperative语法之间的转换关系这种数学问题的话,这些东西不用理会
: learn macros怎么能忘了gnu m4呢?
|
|
c*******v 发帖数: 2599 | 36 著名的internet troll,杀哥和我看法一样
http://xahlee.info/comp/goto_continuation_coroutine.html
这个东西有时候用的还挺多。例如我调试算法,一个个看图。
调用画图函数的时候,需要知道画图函数自己之前被调用过了几次。
第五次就画第五张图。第六次就画第六张图。
: Continuation 你怎么看?我觉得如果放在imperative language 或者汇
编背景
下,就
: 是goto/jmp,加上stack和寄存器的快照。
: 这个东西很多地方吹,是因为
: FP的计算模型实现汇编机器的功能比较难?如果不关心
: FP语法和imperative语法之间的转换关系这种数学问题的话,这些东西不
用理会
|
|
d***a 发帖数: 13752 | 37 volatile和dos没关系啊。它的目的是告䜣编辑器,硬件或其它代码可能会改变
此变量,所以编辑器产生机器代码时,要保证每次对此变量的读写,都是针对其在内存
中的内容,而不是其在寄存器中内容。这个用法在OS代码,I/O驱动程序或嵌入式编程
中很常见。 |
|
w***g 发帖数: 5958 | 38 大家这么折腾, 主要原因是.
用户态线程切换比操统线程切换(都在同一个进程内)要快几百倍. 这个我理解是有两点
.第一进出操统syscall本身比较慢. 第二linux的thread是偷懒版的process,实现比较
低效. windows线程据说比linux线程更慢. 但windows有fiber.
因为只有切换时才有速度差别, 所以一般用户态线程库的优势需要起大量线程, 并且经常
切换才能体现出来. 这种情况发生最多的就是各种web服务器. 别的情况基本没这个需
求.
*起大量线程*这个需求很大程度上是被用户态线程的拥趸为了benchmark需要生造出来
的.
所以答案是:
1. 不是scheduler好. 而是线程切换快. 楼主贴的那个proposal里面也说研究sheduler
不是目标. 这个符合我一直说的用户态thread在多核上schedule难做的观点.
2. 通过jvm支持一套倒腾寄存器的机制, 新增一条context switch的jvm指令. 这个必须
在jvm里面做,并且需要尽可能直接地映射到处理器的context switch指令.
3. java的threa... 阅读全帖 |
|
发帖数: 1 | 39 CUDA目前只有Linux的SDK,一般RTOS沒有CUDA驅動,你怎麼開發?你可能搞到Nvidia的
驅動的源代碼麼?
未來CUDA可能支持QNX,這就是和baremetal的區別。假如你搞中斷代碼,你有Nvidia
SoC的硬件架構手冊麼?哪個中斷?什麼寄存器?寫什麼值?
目前Waymo、Tesla、Baidu自動駕駛都是Linux就說明問題了。
我只想確定為什麼最好是QNX,不是VxWorks或Integrity罷了。
你有回答問題麼? |
|
发帖数: 1 | 40 CUDA目前只有Linux的SDK,一般RTOS沒有CUDA驅動,你怎麼開發?你可能搞到Nvidia的
驅動的源代碼麼?
未來CUDA可能支持QNX,這就是和baremetal的區別。假如你搞中斷代碼,你有Nvidia
SoC的硬件架構手冊麼?哪個中斷?什麼寄存器?寫什麼值?
目前Waymo、Tesla、Baidu自動駕駛都是Linux就說明問題了。
我只想確定為什麼最好是QNX,不是VxWorks或Integrity罷了。
你有回答問題麼? |
|
|
|
g****t 发帖数: 31659 | 43 这类文档一般都是application engineer写的。这个职位偏市场。技术能力一般不高。
到最后你会发现你的很多技术问题是design engineer 才能回答的。芯片的特性和取舍
,以及未来的路线图是system engineer才能回答的。
但客户往往得通过application
engineer才能获得后两者的答案。这就造成了一些老中application engineer在国内装
大爷的独特现象。卖家比买家还牛.
总而言之,芯片这个行业就是个shithole。我原来上万人的工作地点,看到的年轻人越
来越少。来了也往往呆不住。
: 小伙子你的火气太旺了。你们年轻人搞啥,其实俺们这些老年人不见得有
兴趣的。
: 俺也就是在力所能及的情况下,做一些低科技的人事儿就好了。做不了太
复杂的
事情,
: 能把继电器控制好就不错了。
: 昨天还刚刚解决了一个困扰我好几天的问题。watchdog在低功耗睡眠的时
候就是
停不下
: 来。后来俺发现有个调试寄存器MCU文档里面根本没写。
: http://e2e.ti.com/suppo... 阅读全帖 |
|
W******r 发帖数: 789 | 44 我上大学的时候每个学期都会有一到两门计算机课。第一个学期学的是数据库操作。数
据库系统使用一种非常高层的语言。我们在使用的时候不需要知道数据在磁盘上的存储
方式,只需要专注于现实世界的数据视图,使用很简单的命令就能找到我们感兴趣的数
据,然后再使用简单的命令就能对数据进行操作。
第二个学期学的是C语言。C语言需要知道数据在内存中的存储方式,可以使用指针来存
取内存。C语言比数据库语言复杂很多,比较容易出错,出错可能会死机。
第三个学期学的是汇编语言。汇编语言直接和底层硬件打交道,经常要把数据在内存和
寄存器之间移来移去。汇编语言功能强大,可以做许多高级语言做不到的事,但是非常
容易出错,而且一旦出错通常就是死机。那时候调试一个程序死几十次机乃是家常便饭。
我们系的课程设计还是挺合理的,从高层开始学习,然后逐渐深入到底层 。越到高层
就越容易把握,相反,越到底层就越复杂,越容易出错,一旦出错破坏力也越大。
医学也是这个道理。但是有一个很大的不同。计算机是人设计的,我们可以确切地把握
每一个细节。一个汇编程序经过几十次死机最终还是能调试成功。人体是大自然设计的
,比计算机复杂得多,人类永远... 阅读全帖 |
|
p*****e 发帖数: 310 | 45 同样的算法,只是一个是double和double的加减乘除,另一个是complex和com
plex的加减乘除,最后看CPU时间complex那个只是多了20%的时间,请问这是为
什么?
是不是跟什么CPU寄存器级并行计算的关系?在哪里可以找到资料? |
|
x**l 发帖数: 1 | 46 e【 在 ccfantasia (cc-time killer) 的大作中提到: 】
首先,俺是菜鸟。赫赫:)
其次,
如果只是用在测试模块,VHDL不知道,verilog看样子该有。(在最后面)
但是要到fpga里面,呵呵:)
如果对随机性要求不高,建议用移位寄存器搭一个伪随机序列生成器。
如果要求高, 要么自己设计 true random number generator
要么去找 IP core.
3.8.7.系统任务 $random
这个系统函数提供了一个产生随机数的手段。当函数被调用时返回一个32bit的随机数。
它是一个带符号的整形数。
$random一般的用法是:$ramdom % b ,其中 b>0.它给出了一个范围在(-b+1):(b-1)中
的随机数。下面给出一个产生随机数的例子:
reg[23:0] rand;
rand = $random % 60;
上面的例子给出了一个范围在-59到59之间的随机数,下面的例子通过位并接操作产生
一个值在0到59之间的数。
reg[23:0] rand;
rand = {$random} % 60; |
|
w*****s 发帖数: 842 | 47 CISC和RISC只从指令集的角度来讲的,并不能解释ARM的低功耗
ARM面向嵌入式,低功耗还是在于其体系结构的特点:
- 单发射,简单低频流水线(5-9 stage pipeline)
- memory 和 cache 结构简单
- 指令精简带来的例如ALU和寄存器文件的精简
- 其他架构的简化例如MMU,exception handler etc...
对比Intel X86结构的处理器:
- superscalar,高频,深度流水 (as long as 20 stages or more)
- 面向general-purpose,大容量L1 & L2 Cache,复杂Cache结构降低miss rate
- 指令相对复杂支持多媒体指令扩展,etc.
- 为支持通用OS引入的复杂内存管理单元(MMU)和 Exception Handling..
... |
|
n*****n 发帖数: 5277 | 48 ALU里是寄存器参与比较,最小也是byte的,这个比较是并行的,在流水线里都是一个
clock cycle完成的,我不认为这两个时间有什么差异 |
|
g*******y 发帖数: 1930 | 49 寄存器都是32位的,所以ALU的operand也是32位的,除非硬件上另外集成了功能,否则
没法真正直接单独操作bit的。 |
|
a**i 发帖数: 419 | 50 after 时钟沿
在有些编译器下是可能实现的,但编译结果不一定是你期望得到的东西。所有不推荐这么
用,最好用惯用的描写寄存器的方法写,否则编译器指不定给你综合出什么电路来。 |
|