我对 Forth 编程语言进行了短暂的了解。是否可以在 Forth 中使用同步原语进行多线程处理?
例如,是否可以在 Forth 中使用多线程进行 n×n 矩阵乘法?如果是这样,基 native 制或编程模式是什么?
最佳答案
为了实现既定目标,多线程必须是抢先的。 Simple Forths 有一个运行任务的 PAUSE-ing 任务循环 一个接一个,永不重叠。非常有用 但在这种情况下不是。
现代的,专业的,Forth可以做多线程但是我 只知道一个具有特殊原语以使其更容易。
前面给出的示例矩阵乘法不是 多线程演示。
据我所知 (*),只有 iForth 编译器有 特殊的多线程原语(基于 OCCAM), 并附带了真正运行速度快 x 倍的示例 在 n 核处理器上(其中 x < n)。对于矩阵 代码我会使用它的 PAR .. ENDPAR 线程所在的位置 访问在内存中相距很远的行和列, 防止缓存污染。还有一个原语 自动为你拆分 DO-LOOPs,在 此任务所需的方式。 8 个线程的此语法示例是:
0 VALUE jj
: mmul2 ( F: -- r )
a3 /size DFLOATS ERASE
/rsz 0 DO
I TO jj
PAR
STARTP /rsz 0 DO a1 jj /rsz * I + DFLOAT[] DF@ a2 I /rsz * DFLOAT[] a3 jj /rsz * DFLOAT[] /rsz DAXPY_sse2 LOOP ENDP
STARTP /rsz 0 DO a1 jj 1+ /rsz * I + DFLOAT[] DF@ a2 I /rsz * DFLOAT[] a3 jj 1+ /rsz * DFLOAT[] /rsz DAXPY_sse2 LOOP ENDP
STARTP /rsz 0 DO a1 jj 2+ /rsz * I + DFLOAT[] DF@ a2 I /rsz * DFLOAT[] a3 jj 2+ /rsz * DFLOAT[] /rsz DAXPY_sse2 LOOP ENDP
STARTP /rsz 0 DO a1 jj 3 + /rsz * I + DFLOAT[] DF@ a2 I /rsz * DFLOAT[] a3 jj 3 + /rsz * DFLOAT[] /rsz DAXPY_sse2 LOOP ENDP
STARTP /rsz 0 DO a1 jj 4 + /rsz * I + DFLOAT[] DF@ a2 I /rsz * DFLOAT[] a3 jj 4 + /rsz * DFLOAT[] /rsz DAXPY_sse2 LOOP ENDP
STARTP /rsz 0 DO a1 jj 5 + /rsz * I + DFLOAT[] DF@ a2 I /rsz * DFLOAT[] a3 jj 5 + /rsz * DFLOAT[] /rsz DAXPY_sse2 LOOP ENDP
STARTP /rsz 0 DO a1 jj 6 + /rsz * I + DFLOAT[] DF@ a2 I /rsz * DFLOAT[] a3 jj 6 + /rsz * DFLOAT[] /rsz DAXPY_sse2 LOOP ENDP
STARTP /rsz 0 DO a1 jj 7 + /rsz * I + DFLOAT[] DF@ a2 I /rsz * DFLOAT[] a3 jj 7 + /rsz * DFLOAT[] /rsz DAXPY_sse2 LOOP ENDP
ENDPAR
8 +LOOP
0e a3 /size 0 ?DO DF@+ F+ LOOP DROP ;
对于 1024 x 1024 矩阵,此 (mmul2) 比单线程版本 (mmul1) 快两倍。
FORTH> TESTS
DOT/AXPY using 64 bits floats.
Vector size = 1048576
mul0 (dot) : 6.8719411200000000000e+0013 0.133 seconds elapsed.
mul1 (dot_sse2) : 6.8719411200000000000e+0013 0.106 seconds elapsed.
mmul0 (axpy) : 5.6294941655040000004e+0014 0.981 seconds elapsed.
mmul1 (axpy_sse2) : 5.6294941655040000004e+0014 0.400 seconds elapsed.
mmul2 (Paxpy_sse2) : 5.6294941655040000004e+0014 0.114 seconds elapsed. ok
(*) 有传言说 MPE 和 Forth Inc 最近添加了 类似的功能。
关于multithreading - Forth 支持多线程吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32736552/