gpt4 book ai didi

multithreading - Forth 支持多线程吗?

转载 作者:行者123 更新时间:2023-12-05 05:25:02 26 4
gpt4 key购买 nike

我对 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com