*** thread -> warp -> block(>=32 thread) -> grid***
这是一个非常好的具体化问题。理解这个过程的关键在于明白:硬件的输出不再是这四个小数,而是一个具体的“选择结果”(One-Hot 索引或二进制编码)。
假设您的 Softmax 概率分布是 [0.7, 0.2, 0.1, 0.0](为了方便解释,我把最后一个假设为0,凑成总和 1.0;代表类别 A, B, C, D)。
最后的输出是一个确定的状态,通常是二进制编码的索引。 对于这个例子,输出结果会是以下四种情况之一:
- A (二进制
00) —— 出现的几率极大(70%)。 - B (二进制
01) —— 出现的几率较小(20%)。 - C (二进制
10) —— 出现的几率很小(10%)。 - D (二进制
11) —— 几乎不出现(0%)。
您每次“读”这个电路,它就吐出 00、01 或 10 中的一个。 就像您扔了一个灌铅的四面骰子,最后告诉您的只是“朝上的是哪一面”。
硬件不能直接处理 [0.7, 0.2, ...] 这一串数字,它需要把这个多选问题(4选1)拆解成多个二选一问题(也就是构建 PPT 中提到的 贝叶斯网络 )。
FPGA 内部的逻辑会把您的目标分布分解成类似“决策树”的结构。我们需要两个 MTJ 器件(记为 MTJ_1 和 MTJ_2)来输出两个比特位。
-
MTJ_1(高位,决定是前半部分 A/B 还是后半部分 C/D):
-
前半部分概率总和 =
-
后半部分概率总和 =
-
决策:FPGA 计算出,MTJ_1 需要有 90% 的概率输出
0(代表选择 A/B 组),10% 概率输出1(代表 C/D 组)。 -
MTJ_2(低位,决定具体是哪一个):
-
这里存在条件依赖(PPT Slide 6 图 e/c 所示的层级结构):
-
情况 1(如果 MTJ_1 选了前半部分): 在 A(0.7) 和 B(0.2) 里选。A 的相对概率是 。
-
情况 2(如果 MTJ_1 选了后半部分): 在 C(0.1) 和 D(0.0) 里选。C 的相对概率是 。
FPGA 查表或计算得出:
对于 MTJ_1:要实现 90% 的概率,需要 8.5ns 的写脉冲宽度 。
- 对于 MTJ_2:
- 如果逻辑判断当前走的是“前半部分”分支,给它 6.2ns 脉冲(对应 78% 概率)。
- 如果走的是“后半部分”分支,给它 10ns 脉冲(对应 100% 概率)。 (注:这里可以分时步操作,也可以通过并行逻辑实现)
- 写入:FPGA 向电路发送控制信号,MTJ_1 收到 8.5ns 的电流,MTJ_2 收到相应的电流。
- 翻转:MTJ_1 内部的电子自旋发生随机隧穿。
- 大部分时候(90%机会),MTJ_1 变成了低电阻态(代表
0)。 - 偶尔(10%机会),它变成了高电阻态(代表
1)。
- 读取:电路读取 MTJ 的电阻状态。
假设这次运气比较常规:
- MTJ_1 翻转为
0(选中了 A/B 组)。 - MTJ_2 在 78% 的设定下,翻转为
0(选中了 A)。 - 系统输出:二进制
00(对应类别 A)。
这就是 PPT 中提到的**“贝叶斯网络反推”** 的含义。
- 输入:
[0.7, 0.2, 0.1, 0.0](软件告诉硬件想要的分布)。 - 中间转换:FPGA 算出 MTJ_1 需要 90% 偏置,MTJ_2 需要 78% 偏置(条件概率)。
硬件控制:FPGA 发出不同宽度的脉冲 。
- 输出:直接读出一个二进制数(如
00),这个数就是根据概率采样出来的结果。
这个过程完全取代了传统计算机中“先算 Softmax 值,再用随机函数生成随机数,再比对大小”的繁琐步骤。