V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX  ›  lewis89  ›  全部回复第 17 页 / 共 83 页
回复总数  1645
1 ... 13  14  15  16  17  18  19  20  21  22 ... 83  
2021-01-19 09:21:23 +08:00
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
@mxalbert1996 #17 只是猜测,我也没验证过,我只是针对其它编译型语言 做出的猜测判断
2021-01-19 06:26:44 +08:00
回复了 catror 创建的主题 分享发现 温铁军:解构现代化
何为现代化,那就是资本的集约化,何为资本的集约化,那就资本会越来越掌握在少数人手中,虽然整体社会的效率提升了,相比过去生产力水平提升了,但是人民的福祉并不会提升,该包身工的,21 世纪继续会成为包身工,只不过他们有了一个新的名字 --- 996
2021-01-19 06:22:58 +08:00
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
@nuk #15 几乎所有语言都只是 保证单线程自身的 as-if-serial 语义,因为到 CPU 层面 你也不知道 CPU 干了什么优化,CPU 也是保证单线程的 as-if-serial,除非你强制使用 内存栅栏去同步,这样 CPU 就会 invalid 掉 它的重排序
2021-01-19 00:04:56 +08:00
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
@sagaxu #6 system.out.println 这个我也研究过了 println 方法里面的 synchronize 关键字 在底层就用到了 同步的原语
2021-01-19 00:01:05 +08:00
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
@mind3x #9 这个我就不了解了,从我了解的资料来看,包括我看 GCC 的编译后的汇编,都存在重排序优化的情况,所以我对 Java 字节码 也是一种猜测。
2021-01-19 00:00:09 +08:00
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
@fuse #7

重排序是完全可能发生的,因为从编译器到 CPU 都是保证单线程 as-if-serial 语义,
多线程的时候只能用到处理的同步原语才能解决

int a = 2;
int c = 1 + a;
float b = 3f / 2f;

像这种代码 第三条代码完全可能发生重排序,因为浮点运算会用到 FPU 而 CPU 完全是空闲出来的,
而且从 CPU 优化的角度来看,第一条指令跟第二条有依赖,所以不会重排,但是 第三条指令跟 第一条 and 第二条指令不存在任何依赖,所以将 float b= 3f/2f 提前拿出来 交给 FPU 计算 得出结果是完全合理的,而且并不会影响程序的正确性,当然这一切都是在单线程的情况下,如果你多线程需要同步,那么必然要用 x86 lock mfence 这些原语来禁止 重排序
2021-01-18 23:05:03 +08:00
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
@lewis89 #3 关于这些验证的猜想,都得像寻宝一样,设置各种运行条件,参考各种资料,然后到汇编代码层面去验证才能还原出结果来,对于初学者,我不建议大家这么去研究,一来这样研究的价值跟意义不大,应用层面的编程你只要遵循 Java 提供的抽象模型 Happen before 即可,二来如果你计算机体系结构基础不是很扎实的话,很难弄明白底层干了什么,当然如果你是反汇编 搞破解出生的,这些问题就能有办法研究清楚
2021-01-18 22:33:17 +08:00
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
另外书上讲的不一定是发生了指令重排序,也有可能是内存可见性的问题,

sysout() 线程可能根本就没观测到 change() 线程里面 对变量 a 的修改,因为 a 既没有 volatile ( x86 的 lock 原语),可能线程 sysout() 取到 a 的值 只是它在寄存器里面之前的拷贝,或者是线程 sysout() CPU 的 L1 的缓存,
而且 sysout() 跟 change() 线程 都没有用到 同步的原语
2021-01-18 22:24:52 +08:00
回复了 svt 创建的主题 程序员 关于指令重排序有个问题不明白,求大佬指点
说实在话 这个东西验证很困难,涉及到很多技术细节

1. 你要确认 class 文件的字节码是否存在重排序,最好去翻一下字节码,一般这种简单的代码,
我觉得可能字节码层面不会发生重排序

2. 你要用这些代码 反复运行 让 JVM 生成 JIT 后的汇编指令,看下 JIT 后的汇编代码是否存在重排序

3. CPU 层面还有分支预测跟指令冒险 这个更加不好验证

4. 另外这里多线程的话 还要涉及到内存可见性的问题的,因为 CPU 的 L1 L2 L3 同步的模型很复杂,
现在 X86 都是 TSO 模型,具体到 Intel 下面还有 MESI 的模型,另外 AMD zen2 架构流行后,
现在又开始流行 NUMA 了,总之多线程同步下面的技术细节太多。


有兴趣的话 你可以研究我的这篇博文,是关于内存可见性的研究,里面对 JVM 的 JIT 后的代码 用 GDB 打断点验证过了
https://www.cnblogs.com/richard-winters/p/14237940.html

关于重排序跟 memory barrier 这块,你只要记住 多线程同步的时候 一定要用 Java 的锁或者原子变量就行了,
因为这两个都会用 x86 的同步原语 lock sfence mfence 等指令,如果不想搞清楚底层同步的原语,最好的办法就是记住 Java 的 happen before 原则就行了,这样多线程编程的时候就不会被底层的技术细节给搞蒙 B 了。
2021-01-18 10:02:49 +08:00
回复了 ohoh 创建的主题 macOS 黑果, 硬件白痴, 虚心请教
@ohoh #3 不要上 tonymacx86 就行.. 你可以关注一下 司博图
2021-01-18 09:57:02 +08:00
回复了 ElegantOfKing 创建的主题 分享发现 分享自己的无脑挖矿之路,一天大概赚个奶茶钱
@kkhu2004 #33 老哥是个明白人,其实没有谁真正去关心加密货币跟矿机是不是骗局,这东西能赚到钱就是真,币价下来的时候,矿机确实是一个相对低风险的投资方式。 第一矿机是有利息的,除开少部分时候币价低于挖矿成本的时候,这个时候矿机是一个赔本买卖,实际上矿机更像传统的可转债,币价低迷的时候挖矿保本,币价高的时候矿机水涨船高能卖出赚钱,其实最大的问题 在于纳米制程跟新进算力的不可控性, 这两点才是矿机收入的最大不确定性,如果未来几年 5nm 难产,ASIC 矿机没有新的突破,等币价低迷的时候 入手矿机 绝对是低风险高收益的项目。
2021-01-16 18:16:37 +08:00
回复了 Tarkky 创建的主题 问与答 想尝试一下 Linux 作为主力系统
@felixcode #26 从 GNU make automake makefile cmake unix 以及类 unix 上的 编译脚本五花八门 就够你喝一壶了,还要用 pkg-config 去管理依赖版本,这些玩意都是用了好几十年的 陈年烂谷子的玩意了,国内中文文档几乎等于没有,要用 c 语言的构建系统 贼鸡儿烦,openwrt 编译更绝,直接在生成的 makefile 或者 configure 里面打 patch ...

愿意折腾 Linux 下编译 都是勇士..
2021-01-16 18:10:38 +08:00
回复了 Tarkky 创建的主题 问与答 想尝试一下 Linux 作为主力系统
@leafre #5 嫌逼格太低
2021-01-15 08:15:38 +08:00
回复了 waibunleung 创建的主题 程序员 刷 leetcode 的都是怎么进行本地调试的?
@rwecho #10 真实世界编程 肯定要写小的 test case 跟断言,不然写这种算法 +1 -1 改错了就麻烦了
2021-01-15 08:11:37 +08:00
回复了 waibunleung 创建的主题 程序员 刷 leetcode 的都是怎么进行本地调试的?
@rwecho #10 手写 testcase 用大脑推演... 白板编程就是纯粹用大脑去挑战机器
2021-01-15 07:49:50 +08:00
回复了 Laynooor 创建的主题 硬件 显卡贩子太恐怖了...咸鱼一点发布瞬间被脚本围攻
放心,你找个芝麻分好的 确认快的卖就行了,
现在的币价矿老板没几个月就回本了,矿老板没空给你掉包的,
矿老板都急着去挖矿,哪有心思给你玩掉包。
1 ... 13  14  15  16  17  18  19  20  21  22 ... 83  
关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1948 人在线   最高记录 6679   ·     Select Language
创意工作者们的社区
World is powered by solitude
VERSION: 3.9.8.5 · 32ms · UTC 00:41 · PVG 08:41 · LAX 16:41 · JFK 19:41
Developed with CodeLauncher
♥ Do have faith in what you're doing.