【问题标题】:Does Forth support multithreading?Forth 支持多线程吗?
【发布时间】:2015-12-20 14:13:43
【问题描述】:

我对 Forth 编程语言有一段时间的简短了解。是否可以在 Forth 中使用同步原语进行多线程处理?

例如,是否可以在 Forth 中使用多个线程进行 n×n 矩阵乘法?如果有,其基本机制或编程模式是什么?

【问题讨论】:

    标签: multithreading forth stack-based


    【解决方案1】:

    为了既定目标,多线程必须是先发制人的。 简单的 Forths 有一个暂停任务循环来运行任务 一个接一个,从不重叠。非常有用 但在这种情况下不是。

    现代,专业,Forth 可以做多线程,但我 只知道一个具有特殊原语的,以使其更容易。

    前面给出的示例矩阵乘法不是 多线程演示。

    据我所知 (*),只有 iForth 编译器有 特殊的多线程原语(基于 OCCAM), 并附带真正运行速度快 x 倍的示例 在 n 核处理器上(其中 x

    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 最近添加了 类似的功能。

    【讨论】:

      【解决方案2】:

      任何可以进行多任务处理的 Forth 也可以进行多线程处理。 (他们是 在应用程序中做同样的事情。)现在几乎所有的 Forth 都可以做到。

      你可以这样做:

      include fsl-util.f
      
       3 3 float matrix A{{
       A{{ 3 3 }}fread  1e 2e 3e  4e 5e 6e  7e 8e 9e
       3 3 float matrix B{{
       B{{ 3 3 }}fread  3e 3e 3e  2e 2e 2e  1e 1e 1e
       3 3 float matrix C{{    \ result
      
       A{{ B{{ C{{ mat*
       C{{ }}print
      

      【讨论】:

      • 我做了一个编辑给你一个示例代码。希望对您有所帮助,我想不出任何其他方式。
      • 关于fsl-utilf.f -- Forth Scientific Library 不使用多线程进行矩阵乘法,并且根本不支持任何并行性,因为它是仅基于标准功能的通用库.
      【解决方案3】:

      目前,Forth 标准没有指定任何与多线程或多任务相关的词。虽然,许多历史悠久的 Forth 实现都有这样的原语,或者允许使用 Forth-assembler 或 API 定义它们到底层系统。

      例如,同步原语和multithreading in SP-Forth/4 大多只是 Windows 和 Linux (pthreads) API 的通用包装器。

      请注意,应该使用线程池来为小型操作提供更好的性能 - 因为创建/销毁线程可能是耗时的操作。

      也有可能通过使用SSE operations,甚至GPU(参见gpu.js for example),实现n×n矩阵乘法可以获得更好的收益。

      无论如何,解决方案取决于特定的 Forth 系统。

      示例(概念模型)

      使用矩阵和线程池库,矩阵乘法可能如下所示:

      \ matrices vocabulary is in the context.
      
      slot-enum{ m1 m2 m3 tp }slot-enum
      
      : calc-item { r c -- }
        0e  m1 columns 0 do
          r i m1 item
          i c m2 item
          F* F+
        loop  r c m3 item!
      ;
      : mult-matrix ( a b c -- ) \ c = a * b 
        m3! m2! m1!
        \ m3 dimenisions should be m1 rows x m2 columns 
        threadpool::new-group tp!
        m1 rows 0 do m2 columns 0 do
          i j 2 'calc-item tp threadpool::run
        loop
        tp threadpool::join
        tp threadpool::free
      ;
      

      【讨论】:

        猜你喜欢
        • 2011-10-14
        • 2011-03-04
        • 1970-01-01
        • 1970-01-01
        • 2012-06-18
        • 1970-01-01
        • 2012-02-27
        • 2011-12-17
        • 1970-01-01
        相关资源
        最近更新 更多