假设我有一个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) 我在四核计算机上运行一个应用程序,它的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
我在AVX2上工作,需要计算64位x64位 - > 128位加宽乘法,并以最快的方式获得64位高位.由于AVX2没有这样的指令,使用Karatsuba算法提高效率和提高速度是否合理?
将两个或多个大型向量组合在一起的最有效和最惯用的方法是什么?这就是我一直在做的事情.在我的应用程序中,我使用矩阵,因此每个操作比添加两个双精度要贵一些.使用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上最昂贵的位,因为它是唯一的非并行部分并涉及序列.
我正在制作一个游戏,并且有一个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,所以如果出现问题请告诉我.
我试图通过使用线程来加速对大型向量的昂贵计算.我的函数使用向量,计算新值的向量(它不会聚合,但必须保留输入顺序),并返回它.但是,我正在努力弄清楚如何生成线程,为每个线程分配矢量切片,然后收集并合并结果.
// 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::ForkManager模块分叉的Perl脚本.
据我所知,如果我分叉32个子进程并要求SLURM调度程序在4个节点上运行作业,每个节点有8个处理器,则代码将在每个核心上执行每个子进程.
我实验室的某个人说,如果我在多个节点上运行一个工作,那么其他节点就不会被使用,而且我在浪费时间和金钱.这准确吗?
如果我使用的是一个脚本,我只能使用SLURM限制一个节点?
我正在使用我使用字典和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中为Netcdf文件执行并行IO?
我知道有一个名为PyPNetCDF的项目,但显然它已经老了,没有更新,似乎根本不起作用.有没有人在Python中使用NetCDF并行IO?
任何帮助是极大的赞赏
所以我想遍历的东西分区的列表中,说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中做到这一点的好方法,我将非常感激.
非常感谢!