标签: parallel-processing

与z3并行求解公式

假设我有一个z3求解器,其中包含一定数量的可满足的已声明约束。假设S为一组约束,我想为S中的每个约束验证将约束添加到求解器时公式是否仍可满足要求。可以通过以下方式轻松地按顺序完成此操作:

results = []

for constraint in S:
  solver.push()
  solver.add(constraint)
  results.append(solver.check() == z3.sat)
  solver.pop()

print all(results)
Run Code Online (Sandbox Code Playgroud)

现在,我想并行化它来加快处理速度,但是我不确定如何使用z3正确地执行此操作。

这是一个尝试。考虑下面的简单示例。所有变量都是非负整数,并且必须求和为1。现在,我想验证每个变量x是否可以独立地设为> 0。令x = 1并将0赋给其他变量。这是一个可能的并行实现:

from multiprocessing import Pool
from functools import partial
import z3

def parallel_function(f):
    def easy_parallize(f, sequence):
        pool   = Pool(processes=4)
        result = pool.map(f, sequence)

        pool.close()
        pool.join()

        return result

    return partial(easy_parallize, f)

def check(v):
    global solver
    global variables

    solver.push()
    solver.add(variables[v] > 0)
    result = solver.check() == z3.sat
    solver.pop()

    return result

RANGE = range(1000)
solver = z3.Solver()
variables = [z3.Int('x_{}'.format(i)) for i in …
Run Code Online (Sandbox Code Playgroud)

python parallel-processing smt z3 z3py

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

C#Parallel.ForEach不使用可用的CPU功率

我在四核计算机上运行一个应用程序,它的CPU使用率最高可达14%,并且不断地停留在那里.

Parallel.ForEach(pages,
    new ParallelOptions { },
      page =>
      {
         // do some CPU intensive stuff
      });
Run Code Online (Sandbox Code Playgroud)

只有当我启动应用程序的多个实例时,我才能获得超过14%.通过这样做,我总共可以接近100%.

为什么Parallel.ForEach没有并行完成任务以使用所有CPU?

我正在运行C#.NET 4.5.1.

.net c# parallel-processing task-parallel-library parallel.foreach

5
推荐指数
0
解决办法
963
查看次数

在64位x 64位乘法中使用Karatsuba算法真的很有效吗?

我在AVX2上工作,需要计算64位x64位 - > 128位加宽乘法,并以最快的方式获得64位高位.由于AVX2没有这样的指令,使用Karatsuba算法提高效率和提高速度是否合理?

c++ parallel-processing performance simd avx2

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

Clojure reducer - 有效地将函数应用于并行的两个向量

将两个或多个大型向量组合在一起的最有效和最惯用的方法是什么?这就是我一直在做的事情.在我的应用程序中,我使用矩阵,因此每个操作比添加两个双精度要贵一些.使用range驱动倍感觉有点笨拙.

(require '[clojure.core.reducers :as r])

(def a (mapv (fn [_] (rand 100)) (range 100000)))
(def b (mapv (fn [_] (rand 100)) (range 100000)))
(r/foldcat (r/map #(+ (a %) (b %)) (range (count a))))
Run Code Online (Sandbox Code Playgroud)

计算range可能最终成为多核CPU上最昂贵的位,因为它是唯一的非并行部分并涉及序列.

parallel-processing clojure

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

更改ConcurrentHashMap上的现有foreach循环以使用Lambdas来利用并行处理

我正在制作一个游戏,并且有一个ConcurrentHashMap,其中包含当前登录的所有玩家.我有一个AutoSaver线程循环通过HashMap并将所有玩家1保存为1.当没有多少玩家时这很好,因为它迭代时间不会太长,但是当有很多玩家登录时它会慢一点.我使用java流和并行读取,我们可以加快集合的处理,所以我尝试将现有循环改为现在使用并行.

我的问题是,我的实施是否正确?有没有更好的方法呢?它现在是线程安全吗?

这是现有的实现

for(Player player : ActiveConnections.getAllConnectedPlayers().values(){
    if(player != null)
        saveManager.savePlayer(player, true);
}
Run Code Online (Sandbox Code Playgroud)

这是我使用流和并行的实现

ActiveConnections.getAllConnectedPlayers().values()
    .stream()
    .parallel()
    .filter((x) -> x != null)
    .forEach((x) -> saveManager.savePlayer(x, true));
Run Code Online (Sandbox Code Playgroud)

编辑 这是我的保存管理器实现

public class SaveManager {

    private MySqlManager sqlManager;

    public SaveManager(){
        sqlManager = MySqlManager.getInstance();
    }

    public void savePlayer(Player player, boolean autoSave){
       //Saves the player
    }
Run Code Online (Sandbox Code Playgroud)

我刚刚开始使用lambdas,所以如果出现问题请告诉我.

java parallel-processing lambda

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

使用非重叠的矢量块,并组合结果

我试图通过使用线程来加速对大型向量的昂贵计算.我的函数使用向量,计算新值的向量(它不会聚合,但必须保留输入顺序),并返回它.但是,我正在努力弄清楚如何生成线程,为每个线程分配矢量切片,然后收集并合并结果.

// tunable
const NUMTHREADS: i32 = 4;

fn f(val: i32) -> i32 {
    // expensive computation
    let res = val + 1;
    res

}

fn main() {
    // choose an odd number of elements
    let orig = (1..14).collect::<Vec<i32>>();
    let mut result: Vec<Vec<i32>> = vec!();
    let mut flat: Vec<i32> = Vec::with_capacity(orig.len());
    // split into slices
    for chunk in orig.chunks(orig.len() / NUMTHREADS as usize) {
        result.push(
            chunk.iter().map(|&digit|
                f(digit)).collect()
            );
    };
    // flatten result vector
    for subvec in result.iter() {
        for elem …
Run Code Online (Sandbox Code Playgroud)

parallel-processing multithreading rust

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

SLURM上的多线程

我有一个使用该Parallel::ForkManager模块分叉的Perl脚本.

据我所知,如果我分叉32个子进程并要求SLURM调度程序在4个节点上运行作业,每个节点有8个处理器,则代码将在每个核心上执行每个子进程.

我实验室的某个人说,如果我在多个节点上运行一个工作,那么其他节点就不会被使用,而且我在浪费时间和金钱.这准确吗?

如果我使用的是一个脚本,我只能使用SLURM限制一个节点?

linux parallel-processing perl fork slurm

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

使用MPI的Allreduce汇总Python对象

我正在使用我使用字典和Python中的计数器构建的稀疏张量数组操作.我想可以并行使用这个数组操作.最重要的是,我最终在每个节点上都有计数器,我想用MPI.Allreduce(或另一个不错的解决方案)加在一起.例如,使用计数器可以做到这一点

A = Counter({a:1, b:2, c:3})
B = Counter({b:1, c:2, d:3})
Run Code Online (Sandbox Code Playgroud)

这样的

C = A+B = Counter({a:1, b:3, c:5, d:3}).
Run Code Online (Sandbox Code Playgroud)

我想做同样的操作,但所有相关的节点,

MPI.Allreduce(send_counter, recv_counter, MPI.SUM)
Run Code Online (Sandbox Code Playgroud)

但是,MPI似乎没有在字典/计数器上识别此操作,从而引发错误expecting a buffer or a list/tuple.我最好的选择是"用户定义的操作",还是有办法让Allreduce添加计数器?谢谢,

编辑(2015年7月14日):我试图为字典创建用户操作,但存在一些差异.我写了以下内容

def dict_sum(dict1, dict2, datatype):
    for key in dict2:
        try:
            dict1[key] += dict2[key]
        except KeyError:
            dict1[key] = dict2[key]
Run Code Online (Sandbox Code Playgroud)

当我告诉MPI关于我这样做的功能时:

dictSumOp = MPI.Op.Create(dict_sum, commute=True)
Run Code Online (Sandbox Code Playgroud)

在我用它的代码中

the_result = comm.allreduce(mydict, dictSumOp)
Run Code Online (Sandbox Code Playgroud)

然而,它扔了unsupported operand '+' for type dict.所以我写了

the_result = comm.allreduce(mydict, op=dictSumOp)
Run Code Online (Sandbox Code Playgroud)

现在它dict1[key] += dict2[key] TypeError: 'NoneType' object has …

python parallel-processing dictionary mpi mpi4py

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

是否有任何并行方式访问Python中的Netcdf文件

有没有办法在Python中为Netcdf文件执行并行IO?

我知道有一个名为PyPNetCDF的项目,但显然它已经老了,没有更新,似乎根本不起作用.有没有人在Python中使用NetCDF并行IO?

任何帮助是极大的赞赏

python io parallel-processing netcdf

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

Julia:并行循环遍历分区迭代器

所以我想遍历的东西分区的列表中,说1:n了一些n13和21,我非常想运行的代码看起来像这样之间:

valid_num = @parallel (+) for p in partitions(1:n)
  int(is_valid(p))
end

println(valid_num)
Run Code Online (Sandbox Code Playgroud)

这将使用@parallel formap来减少我的问题.例如,将其与Julia文档中的示例进行比较:

nheads = @parallel (+) for i=1:200000000
  Int(rand(Bool))
end
Run Code Online (Sandbox Code Playgroud)

但是,如果我尝试修改循环,我会收到以下错误:

ERROR: `getindex` has no method matching getindex(::SetPartitions{UnitRange{Int64}}, ::Int64)
 in anonymous at no file:1433
 in anonymous at multi.jl:1279
 in run_work_thunk at multi.jl:621
 in run_work_thunk at multi.jl:630
 in anonymous at task.jl:6
Run Code Online (Sandbox Code Playgroud)

我想这是因为我想遍历的东西,是不是形式1:n(编辑:我想这是因为你不能说p[3]如果p=partitions(1:n)).

我已经尝试过pmap用来解决这个问题,但是因为分区的数量可以变得非常大,非常快(有超过250万个分区1:13,当我得到的1:21东西将是巨大的)时,构建这么大的数组变成了问题.我让它跑了一夜,但仍然没有完成.

有没有人对如何在朱莉娅有效地做到这一点有任何建议?我可以访问~30核心计算机,我的任务似乎很容易并行化,所以如果有人知道在Julia中做到这一点的好方法,我将非常感激.

非常感谢!

parallel-processing julia

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