multithreading - Forth 支持多线程吗?

标签 multithreading forth stack-based

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

相关文章:

language-agnostic - 寄存器与堆栈

multithreading - Perl 线程中的 join 会阻止 SIGALRM 吗?

ubuntu - 建筑琼斯福斯 - asm/unistd.h : No such file or directory

c# - 当可能存在迭代器时替换并发集合是否是线程安全的?

math - 64 位乘法/除法,无需 64 位乘法或除法指令

gcc - 琼斯福斯段错误

parsing - 我将如何着手实现一种简单的基于堆栈的编程语言

c# - 在 for 循环中创建新线程并传递参数

c# - 在 .NET 4.5 中并行运行 .exe 进程并更新进度条