小编Chr*_*nos的帖子

Haskell框架,用于并行化非线程安全的C++库

我有一个闭源非线程安全的C++共享库,它提供了一个函数f :: ByteString - > ByteString.此功能的运行时间可能介于一秒到几个小时之间.

我正在寻找一种方法将计算分配到多个核心/服务器(SIMD).

简而言之,我正在寻找一个提供功能的框架

    g :: Strategy b -> (a -> b) -> a -> b
Run Code Online (Sandbox Code Playgroud)

提升一个只能被顺序调用到一个函数的函数,该函数的行为类似于Haskell中的任何其他纯函数.

例如,我希望能够写:

    parMap rwhnf f args -- will not work
Run Code Online (Sandbox Code Playgroud)

由于f通过FFI在非线程安全的lib中调用C函数,因此不起作用.因此,我可以用函数g替换函数f,函数g保存作业队列并将任务分派给N个单独的进程.这些进程可以在本地运行或分发:

    parMap rwhnf g args -- should works
Run Code Online (Sandbox Code Playgroud)

我已经研究过的潜在框架是

  1. MPI:客户端(Haskell)< - MPI - >代理(C++)< - MPI - >工作者(C++)< - > Lib(C++)

  2. ZeroMQ:客户端(Haskell)< - ZeroMQ - > Broker(C++)< - ZeroMQ - > Worker(C++)< - > Lib(C++)

  3. Cloud Haskell:客户端(Haskell)< - CloudHaskell - > Worker(Haskell)< - FFI - > Lib(C++) …

concurrency haskell distributed-computing gearman zeromq

6
推荐指数
1
解决办法
490
查看次数

GADT或幻像类型用于类型检查函数调用但保持类型的同质性

我假设使用类型算法可以解决以下问题但尚未找到解决方案.

问题

我有一个从字符串到值的有限映射(使用Tries作为实现),我从二进制/文本文件(json,xml,...)解析.

type Value = ...
type Attributes = Data.Trie Value 
data Object = Object Attributes
Run Code Online (Sandbox Code Playgroud)

每个映射都具有相同类型的值,但不具有相同的键集.我将具有相同键集的地图组合在一起,以便能够防止必须一直打字 - 我有一个需要某些键的专门功能:

data T1
data T2 
...

data Object a where
    T1 :: Attributes -> Object T1
    T2 :: Attributes -> Object T2
    ...
Run Code Online (Sandbox Code Playgroud)

这允许我写下这样的东西:

f1 :: Object T1 -> ...
Run Code Online (Sandbox Code Playgroud)

代替

f1 :: Object ->
f1 o | check_if_T1 o = ...
Run Code Online (Sandbox Code Playgroud)

这有效,但有两个缺点:

  1. 对象的同类列表现在变得异构,即我不能再有列表[Object].
  2. 我需要编写很多样板来获取/设置属性:

    get :: Object a -> Attributes
    get (T1 a) = a
    get (T2 a) = a …
    Run Code Online (Sandbox Code Playgroud)

haskell algebraic-data-types

5
推荐指数
1
解决办法
345
查看次数

用于F#的LP DSL,其中Clp作为解算器

由于Microsoft Solver Foundation已被弃用,我试图找到一种替代或合理的方法来创建自己的DSL.

我正在寻找的是在F#中描述LP的DSL必不可少的,用Clp解决它并评估结果.

在重新发明轮子之前:有人知道一个已经为LP提供DSL的好库吗?

否则,你将如何在F#中构建这样的DSL?从本质上讲,我希望能够写出类似的东西

let xs = createVars 100 in 0..1
let ys = [| 1 .. 100 |]
let f i x = i*x
let lp = 
    minimize sumprod(xs, ys) subjectTo [
      xs.[0] + xs.[1] = 1
      sum(xs) <= 1
      sum({for i in 1..100 -> f i xs.[i]}) <= 100
      // ...
    ]
let solver = Clp()
let result = solver.solve lp
Run Code Online (Sandbox Code Playgroud)

clr dsl f# linear-programming clp

2
推荐指数
1
解决办法
326
查看次数