我已经阅读了很多关于并行性与并发性有何不同的文章,但我有很多问题,例如如何使用 Java 等编程语言实现并行性?
到目前为止,我所理解的是使用像 Java 这样的 VM 我们只能实现并发性,而并行性不在 JVM 的范围内,它的线程映射到(我在这里很困惑)操作系统线程或内核线程?
要了解多线程,需要了解 VM (JVM) 或进程的线程实际上是如何映射到 CPU 硬件的。请在这里帮忙。
如果我错了,请纠正我,以下是我认为我理解正确的几件事:
1. CPU 线程(英特尔超线程):通过在具有相同 ALU 的 CPU 中添加更多寄存器来提供硬件线程,因此实际上并不表现为双 CPU(如果 CPU 中有 2 个线程)和“只是”并发使用 ALU 可以掩盖(通过交错 MUXing 隐藏)主要无法提供真正的并行代码执行。
2. 内核线程:由内核启动,这些线程的数量可能比 CPU 线程多,但启动起来有点贵。
3. 操作系统线程:我不明白。我猜这就是您在调用本机线程时的意思,并且可能与之前的 #2(即内核线程)相同。
4. 用户线程:就像new Thread()在 JVM 或 .NET 中一样。我认为它们不被操作系统识别为线程,所以从并行性的角度来看,这里没有什么可以做的。
我需要了解 #4 中创建的线程如何映射到 #1,可能是 Windows/Linux/MacOS 的示例。
伙计们,我了解这个问题的范围有多大,但我可以接受简要信息并链接到任何详细文档。提前致谢。
java parallel-processing concurrency multithreading multitasking
我正在使用joblib并行化我的 python 3.5 代码。
如果我做:
from modules import f
from joblib import Parallel, delayed
if __name__ == '__main__':
Parallel( n_jobs = n_jobs,backend = "multiprocessing")(delayed(f)(i) for i in range( 10 ))
Run Code Online (Sandbox Code Playgroud)
代码不起作用。反而:
from joblib import Parallel, delayed
def f( i ):
# my func ...
if __name__ == '__main__':
Parallel( n_jobs = n_jobs, backend = "multiprocessing")(delayed(f)(i) for i in range(10))
Run Code Online (Sandbox Code Playgroud)
这有效!
有人可以解释为什么我必须将所有函数放在同一个脚本中吗?
这真的不切实际,因为在模块中有很多我编码的函数,我不想在主脚本中复制/粘贴。
我正在尝试在 CUDA 7.5 中实现并行归约和。我一直在尝试遵循NVIDIA PDF,它会引导您完成初始算法,然后稳步优化版本。我目前正在制作一个用 1 作为每个数组位置的值的数组,以便我可以检查输出是否正确,但我得到的值为 -842159451 的大小为 64 的数组。我期待内核代码是正确的,因为我遵循了 NVIDIA 的确切代码,但这是我的内核:
__global__ void reduce0(int *input, int *output) {
extern __shared__ int sdata[];
unsigned int tid = threadIdx.x;
unsigned int i = blockIdx.x * blockDim.x + threadIdx.x;
sdata[tid] = input[i];
__syncthreads();
for (unsigned int s = 1; s < blockDim.x; s *= 2) {
if (tid % (2 * s) == 0) {
sdata[tid] += sdata[tid + s];
}
__syncthreads();
}
if (tid == 0) output[blockIdx.x] = …Run Code Online (Sandbox Code Playgroud) 我一直在尝试并行化以下脚本,特别是 for 循环。我怎样才能做到这一点?
#!/bin/bash
for i in `cat /root/vms`;
do
/usr/bin/sshpass -p 'test' /usr/bin/ssh -o StrictHostKeyChecking=no \
-l testuser $i -t 'echo test | sudo -S yum update -y'
done
Run Code Online (Sandbox Code Playgroud) 所以我无法理解这里的概念。我有一个使用 Parallel 类和 Foreach 方法的方法。但我不明白的是,它是否会创建新线程以便更快地运行该函数?
让我们以此为例。我做了一个普通的 foreach 循环。
private static void DoSimpleWork()
{
foreach (var item in collection)
{
//DoWork();
}
}
Run Code Online (Sandbox Code Playgroud)
它将做的是,它将获取列表中的第一项,分配方法 DoWork(); 并等待它完成。简单,简单,有效。
现在.. 如果我这样做,我对三种情况感到好奇。
Parallel.ForEach(stringList, simpleString =>
{
DoMagic(simpleString);
});
Run Code Online (Sandbox Code Playgroud)
这会将 Foreach 分成 4 个块吗?所以我认为正在发生的是它需要列表中的前 4 行,将每个字符串分配给每个“线程”(假设并行创建 4 个虚拟线程)完成工作,然后从该列表中的下 4 行开始?如果那是错误的,请纠正我我真的很想了解这是如何工作的。
然后我们有了这个。本质上是相同的,但有一个新参数
Parallel.ForEach(stringList, new ParallelOptions() { MaxDegreeOfParallelism = 32 }, simpleString =>
{
DoMagic(simpleString);
});
Run Code Online (Sandbox Code Playgroud)
我很好奇的是这个
new ParallelOptions() { MaxDegreeOfParallelism = 32 }
Run Code Online (Sandbox Code Playgroud)
这是否意味着它将从该列表中获取前 32 个字符串(如果列表中有那么多字符串),然后执行与我上面所说的相同的操作?
而对于最后一个。
Task.Factory.StartNew(() =>
{
Parallel.ForEach(stringList, simpleString =>
{
DoMagic(simpleString);
});
}); …Run Code Online (Sandbox Code Playgroud) 假设我们有两个执行者,1 和 2。
我们可以配置执行时使用哪个执行器
CompletableFuture<Integer> cf1 = CompletableFuture.supplyAsync(()-> {return 1;}, executor1) //executor1
CompletableFuture<Integer> cf2 = CompletableFuture.supplyAsync(()-> {return 2;}, executor1) //executor1
CompletableFuture<Integer> cf3 = CompletableFuture.supplyAsync(()-> {return 3;}, executor2) //executor2
Run Code Online (Sandbox Code Playgroud)
但是哪个线程执行器使用 CompletableFuture 静态方法 allOf?
CompletableFuture.allOf(cf1, cf2, cf3)
Run Code Online (Sandbox Code Playgroud)
谢谢!
以前我使用 Maven+Selenide+JUnit4 进行我的测试,它很好,并行运行效果很好。例子:
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-surefire-plugin</artifactId>
<version>${maven.surefire.plugin}</version>
<configuration>
<parallel>all</parallel>
<perCoreThreadCount>true</perCoreThreadCount>
<threadCount>4</threadCount>
<perCoreThreadCount>false</perCoreThreadCount>
<redirectTestOutputToFile>true</redirectTestOutputToFile>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
在 Jenkins 的工作中,我能够运行测试(下面的示例)
mvn -Dtest=TestClassName test
Run Code Online (Sandbox Code Playgroud)
我的测试在 4 个浏览器中运行。
在我切换到JUnit5之前,因为我想使用标签运行测试,例如
@Test
@Tag("smoke")
public void test1() {}
Run Code Online (Sandbox Code Playgroud)
并通过下一个命令运行所有标记为“smoke”的测试:
mvn -Dtag=smoke test
Run Code Online (Sandbox Code Playgroud)
但是我遇到了下一个问题:并行执行不起作用,我仍然没有找到解决方案。我发现了这个错误https://github.com/junit-team/junit5/issues/1424
如何与 JUnit5 并行运行测试?
我曾尝试在pom.xml 中使用
<forkCount>2</forkCount>
<reuseForks>true</reuseForks>
<parallel>all</parallel>
Run Code Online (Sandbox Code Playgroud)
它没有帮助,我创建了一个文件junit-platform.properties并在那里插入
junit.jupiter.execution.parallel.enabled = true
junit.jupiter.execution.parallel.config.strategy = fixed
Run Code Online (Sandbox Code Playgroud)
但无论如何我无法解决这个问题。
使用pmap函数时,如果该函数未在任何工作进程上定义,则会发生错误。但是,当函数调用其他函数或在另一个.jl文件中使用其他函数时,@everywhere在每个相关函数上都使用宏当然不是一个好的解决方案。
有没有一种巧妙的方法可以有效地将函数及其助手发送给所有可用的工作人员?
我想加速一个算法(完整的本地二进制模式与圆形邻居),我遍历所有像素并用它的邻居计算一些东西(所以我需要邻居像素访问)。
目前我通过用一个线程/进程迭代所有像素来做到这一点。我想通过将输入图像分成多个 ROI 并单独计算每个 ROI(使用多个线程)来并行化此任务。
这里的问题是,ROI 是重叠的(因为要计算一个像素,有时我需要看远处的邻居),并且多个线程可能同时访问像素数据(READING)。如果两个或多个线程同时在相同的索引上读取相同的 Mat,这是一个问题吗?
如果我写入相同的 Mat 并行但使用不同的索引,这也是一个问题吗?
我有一个依赖于 MPI 的 mpi4py 实现的 python 脚本。这需要通过 mpiexec(或 mpirun)运行。
我的问题是:如何直接从 PyCharm 使用 mpiexec(或 mpirun)运行(并希望调试)python 脚本?
将 mpiexec 作为外部工具运行不是一个好主意,因为我将无法调试它。
我可以做什么?