首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Forth支持多线程吗?

Forth支持多线程吗?
EN

Stack Overflow用户
提问于 2015-09-23 18:02:53
回答 3查看 1.6K关注 0票数 2

我对Forth编程语言有过一段时间的了解。在Forth中可以使用同步原语进行多线程吗?

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

EN

回答 3

Stack Overflow用户

发布于 2015-10-05 01:45:04

对于规定的目标,多线程必须是先发制人的。简单的Forth有一个暂停的任务循环,它一个接一个地运行任务,从不重叠。出乎意料的有用,但在这种情况下不是这样。

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

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

据我所知(*),只有iForth编译器有特殊的多线程原语(基于OCCAM),并且附带了在n核处理器(其中x< n)上运行速度真正快x倍的示例。对于矩阵代码,我将使用它的PAR。ENDPAR,线程访问在内存中相隔很远的行和列,以防止缓存污染。还有另一个原语可以自动为你拆分DO-循环,就像这个任务所需要的那样。此语法用于8个线程的示例如下:

代码语言:javascript
复制
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 ;

对于1024x1024矩阵,这种(mmul2)大约比单线程版本(mmul1)快两倍。

代码语言:javascript
复制
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
EN

Stack Overflow用户

发布于 2015-09-23 18:05:46

任何可以执行多任务的Forth都可以执行多线程。(它们在应用程序中是相同的。)现在几乎所有的人都能做到。

你可以这样做:

代码语言:javascript
复制
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
票数 0
EN

Stack Overflow用户

发布于 2017-07-10 00:56:57

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

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

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

也有可能n乘n矩阵乘法的实现可以从使用SSE operations甚至图形处理器(参见gpu.js for example)中获得更好的增益。

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

示例(概念模型)

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

代码语言:javascript
复制
\ 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
;
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32736552

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档