标签: parallel-processing

SCIP 中线程的使用

在 SCIP 参数列表中,我看到三种类型的线程使用引用:

  • lp/threads(根据这个问题,用于求解LP的线程在使用SoPlex时并不重要)。

  • parallel/{min, max}threads(并行求解期间的线程数)。

  • concurrent/*(与并发模式下使用线程相关的参数)。

我的问题是:使用默认安装时 SCIP 中如何使用线程?这些参数与并发求解器parallel/{min, max}threads相关吗?如果我不打开并发求解器,SCIP 是否会使用可用线程来并行求解分支定界子问题?

提前致谢!

parallel-processing mathematical-optimization scip

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

在 #define 宏中控制条件 Openmp

我想用一个#define标志来控制是否使用 openmp。由于#pragma不能不在 a 内#define,所以我尝试了

#define USE_OPENMP  // Toggle this on/off

#ifdef USE_OPENMP
    #define OMP_FOR(n)   __pragma("omp parallel for if(n>10)") 
#else
    #define OMP_FOR(n)   // do nothing        
#endif
Run Code Online (Sandbox Code Playgroud)

然后在我的代码中我可以:

int size_of_the_loop = 11;
OMP_FOR(size_of_the_loop) // activate openmp if(n>10)
for(){
    //do stuff
}
Run Code Online (Sandbox Code Playgroud)

我对#define相关的东西不熟悉,想知道是否可以实现这一目标?谢谢。

c++ parallel-processing openmp visual-studio

5
推荐指数
2
解决办法
3649
查看次数

利用 SLURM 上的所有 CPU

我想在集群上运行作业。不同节点上有不同数量的 CPU,我不知道哪些节点将分配给我。正确的选项是什么,以便作业可以在所有节点上创建与 CPU 一样多的任务?

#!/bin/bash -l

#SBATCH -p normal
#SBATCH -N 4
#SBATCH -t 96:00:00

srun -n 128 ./run
Run Code Online (Sandbox Code Playgroud)

parallel-processing multithreading hpc mpi slurm

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

R未来多会话限制cpu数量

我目前正在使用 future 包进行并行化,如下所示:

plan(multisession, gc = TRUE)
standardised_addresses1 <- future_lapply(1:20000, function(x) x*x) 
Run Code Online (Sandbox Code Playgroud)

问题是它使用了服务器上的所有 CPU。我想通过设置如下参数来限制使用的CPU数量:workers = 18

parallel-processing r cpu-usage r-future

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

torch.nn.DataParallel 如何更改输出大小?

看起来使用torch.nn.DataParallel改变了输出大小。尽管在官方文档https://pytorch.org/docs/stable/nn.html#torch.nn.DataParallel中 ,有关大小更改的所有信息如下:

当模块在forward()中返回一个标量(即0维张量)时,该包装器将返回一个长度等于数据并行中使用的设备数量的向量,其中包含每个设备的结果。

我的模块返回 10 个坐标的张量,并且我有 2 个 GPU,我想在其中运行代码。我的 CNN 的最后一层是nn.Linear(500, 10).

import torch
import torch.nn as nn

net = LeNet()    #CNN-class written above
device = torch.device("cuda:0")
net.to(device)
net = nn.DataParallel(net)

#skipped some code, where inputs and targets are loaded from files

output = net(input)
criterion = nn.SmoothL1Loss()
loss = criterion(output, target)
Run Code Online (Sandbox Code Playgroud)

请注意,不调用DataParallel这段代码也可以正常工作。DataParallel当尝试计算损失时会发生运行时错误。

RuntimeError: The size of tensor a (20) must match the size of tensor b (10) at non-singleton …
Run Code Online (Sandbox Code Playgroud)

parallel-processing conv-neural-network pytorch

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

C++17/20 并行算法:对对象的不同步访问

阅读[algorithms.parallel.exec]p2上最新的 C++20 草案,我发现了 C++17 中没有的一段:

\n\n
\n

如果某个对象被元素访问函数修改,则该算法将不会对该对象执行其他非同步访问。修改元素访问函数是那些被指定为修改对象的函数。[注意:例如,swap++--@=和 赋值修改对象。对于赋值和@=运算符,仅修改左侧参数。\xe2\x80\x94尾注]

\n
\n\n

这究竟保证了什么?为什么添加它?

\n\n

例如,这是否保证“并行”算法在算法的整个执行过程中不会将迭代器递增两次?(或者,如果是的话,它将以同步/顺序的方式)?

\n

c++ algorithm parallel-processing language-lawyer c++20

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

Parallel.ForEach 中每个线程的 DbContext 安全吗?

我现在正在签订一份合同,以提高使用 EF 6 作为 ORM 的现代 SaaS SPA Web 应用程序的后端服务的性能。我建议的第一件事是向当前运行单线程的后端服务引入一些多线程。首席软件工程师表示我们不能这样做,因为 EF 6 不是线程安全的。

我不是实体框架方面的专家。我选择的 ORM 是 DevExpress 的 XPO,并且我已经完成了与下面建议的类似的操作,使用该 ORM 没有出现问题。使用 EF 6 这种模式本质上不安全吗?

int[] ids;
using(var db = new ApplicationDbContext())
{
    // query to surface id's of records representing work to be done
    ids = GetIdsOfRecordsRepresentingSomeTask(db);
}

Parallel.ForEach(ids, id => { 
    using(var db = new ApplicationDbContext())
    {
        var processor = new SomeTaskProcessor(db, id);
        processor.ExecuteLongRunningProcessThatReadsDbAndCreatesSomeNewRecords();
        db.SaveChanges();
    }
});
Run Code Online (Sandbox Code Playgroud)

我对此进行了研究,并且我同意 DbContext 不是线程安全的。我建议的模式确实使用多个线程,但单个 DbContext 仅由单个线程以单线程方式访问。领导告诉我,DbContext 本质上是一个单例,这段代码最终会弄乱数据库。我找不到任何东西来支持这个说法。这件事上的领导正确吗?

谢谢

c# parallel-processing multithreading entity-framework entity-framework-6

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

R包设计:如何将内部函数导出到集群

我正在开发 R 包,并且需要myfun使用parallel::parLapply. myfun调用我的包中的几个附加函数,这些函数又调用更多函数,其中一些函数有多个方法......因此按名称显式将所有函数和方法传递到集群非常麻烦。

据我了解,标准建议是跑步 parallel::clusterEvalQ({library("my_package")})。但对 R-CMD-check 的调用library("my_package")显然是令人厌恶的。我有理由相信这my-package:::function也不会在 CRAN 上运行。

这里的标准方法是什么?我需要按名称导出每个相关函数和方法吗?

parallel-processing r r-package

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

使用双缓冲区技术进行并发读写?

我有一个相对简单的案例:

  1. 我的程序将通过 Websockets 接收更新,并将使用这些更新来更新其本地状态。这些更新将非常小(通常 < 1-1000 字节 JSON,因此反序列化 < 1 毫秒),但会非常频繁(高达 ~1000/s)。
  2. 同时,程序将从该本地状态读取/评估并输出其结果。
  3. 这两个任务应该并行运行,并且将在程序的持续时间内运行,即永远不会停止。
  4. 本地状态大小相对较小,因此内存使用量不是一个大问题。

棘手的部分是更新需要“原子地”发生,这样它就不会从本地状态读取,例如,只写入了一半的更新。状态不限于使用原语,并且可以包含任意类 AFAICT atm,因此我无法通过使用Interlocked原子操作之类的简单方法来解决它。我计划在其自己的线程上运行每个任务,因此在本例中总共有两个线程。

为了实现这个目标,我想使用双缓冲区技术,其中:

  1. 它保留状态的两份副本,以便在写入另一份时可以读取一份。
  2. 线程可以通过使用锁来传达它们正在使用哪个副本。即 Writer 线程在写入时锁定副本;读取器线程在完成当前副本后请求访问锁;编写器线程看到读取器线程正在使用它,因此它切换到其他副本。
  3. 写入线程会跟踪在当前副本上完成的状态更新,因此当它切换到另一个副本时,它可以“赶上”。

这是这个想法的总体要点,但实际的实现当然会有点不同。

我试图查找这是否是一个常见的解决方案,但找不到太多信息,所以这让我想知道以下内容:

  1. 它可行吗,还是我错过了什么?
  2. 有更好的方法吗?
  3. 这是一个通用的解决方案吗?如果有的话,通常被称为什么?
  4. (奖励)是否有一个好的资源可供我阅读与此相关的主题?

我几乎觉得我已经走进了一个死胡同,我找不到(因为我不知道要搜索什么)更多的资源和信息来看看这种方法是否“好”。我计划用 .NET C# 编写此内容,但我认为这些技术和解决方案可以转换为任何语言。所有见解均受到赞赏。

c# parallel-processing concurrency multithreading multiprocessing

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

有没有办法将 torch.nn.DataParallel 与 CPU 一起使用?

我正在尝试更改一些 PyTorch 代码,以便它可以在 CPU 上运行。

该模型经过训练,torch.nn.DataParallel()因此当我加载预训练模型并尝试使用它时,我必须使用nn.DataParallel()我目前正在做的事情,如下所示:

device = torch.device("cuda:0")
net = nn.DataParallel(net, device_ids=[0])
net.load_state_dict(torch.load(PATH))
net.to(device)
Run Code Online (Sandbox Code Playgroud)

然而,当我将我的手电筒设备切换到 CPU 后,如下所示:

device = torch.device('cpu')
net = nn.DataParallel(net, device_ids=[0])
net.load_state_dict(torch.load(PATH))
net.to(device)
Run Code Online (Sandbox Code Playgroud)

我收到这个错误:

File "C:\My\Program\win-py362-venv\lib\site-packages\torch\nn\parallel\data_parallel.py", line 156, in forward
    "them on device: {}".format(self.src_device_obj, t.device))
RuntimeError: module must have its parameters and buffers on device cuda:0 (device_ids[0]) but found one of them on device: cpu
Run Code Online (Sandbox Code Playgroud)

我假设它仍在寻找 CUDA,因为这就是device_ids设置的内容,但有没有办法让它使用 CPU?PyTorch 存储库中的这篇文章让我认为我可以,但它没有解释如何做到。

如果没有,是否有其他方法可以在您的 CPU 上使用通过 DataParallel 训练的模型?

python parallel-processing pytorch

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