我们都为单处理器编写代码。我想知道我们什么时候都能够在多处理器上编写代码?
我们需要什么(软件工具、逻辑、算法)来进行这种切换?
编辑:在我看来,由于我们并行执行许多任务,因此我们需要以同样的方式将那些现实生活中的解决方案(算法)转换为计算机语言。就像 OOP 编码对过程编码所做的那样。OOP 是一种更真实的编码风格,而不是过程式的。所以我希望有这种解决方案。
math parallel-processing multithreading high-speed-computing
前言:当我在下面说“机器”时,我指的是物理专用服务器,或虚拟专用服务器。当我说“节点”时,我的意思是 erlang 虚拟机的一个实例,其中可以有多个作为单独进程在单个 unix 内核下运行。
我有一个涉及多个 erlang/OTP 应用程序的项目。这些应用程序将一起运行并在同一台机器上相互通信。它们都将访问磁盘,使用内存并生成 erlang 进程。他们还将使用网络资源,因为他们将与集群中运行相同应用程序集的类似机器进行通信。
几乎所有这些通信都是通过 HTTP 进行的。因此,我可以将每个 erlang OTP 应用程序分离到同一台机器上的 erlang VM 的单独实例中,并且它们仍然可以相互通信。
我的问题是:让它们全部运行在一个 erlang VM 下是否更好,以便这个 erlang VM 进程可以在它们之间分配对资源的访问,并安排各种 erlang 进程的执行。
还是在给定的服务器上有单独的 erlang 节点更好?
如果一个比另一个好,为什么?
我假设在单个 erlang vm 中运行所有这些应用程序,本质上,服务器的完整运行将导致更好的性能。操作系统只是在低级别管理磁盘和内存,并且只有一个重要的进程(erlang VM)可以切换……而当 erlang VM 具有所有的整体视图时,它在分配资源方面可能更聪明二郎进程。
这可能是我需要测试的东西,但我无法在短期内有效地这样做。
我正在寻找omp.h在 eclipse 中使用它的文件。我在 openmp.org 中找不到它。
我在哪里找到omp.h?
谢谢。
给定 n 个线程,有没有一种方法可以计算在 OpenMP 中实现特定指令所需的开销(例如循环数)。
例如,给定下面的代码
#pragma omp parallel
{
#pragma omp for
for( int i=0 ; i < m ; i++ )
a[i] = b[i] + c[i];
}
Run Code Online (Sandbox Code Playgroud)
我可以以某种方式计算创建这些线程需要多少开销吗?
问题说明了一切。在我看来,矢量化与令人尴尬的并行问题密切相关。换句话说,所有可矢量化的程序都必须是令人尴尬的并行程序。这样对吗?
这是一个示例程序:
#!/bin/bash
for x in {1..5}
do
output[$x]=$(echo $x) &
done
wait
for x in {1..5}
do
echo ${output[$x]}
done
Run Code Online (Sandbox Code Playgroud)
我希望它运行并打印出分配给output数组每个成员的值,但它什么也不打印。删除&正确分配变量。我必须使用不同的语法来并行实现吗?
什么是使用CancellationToken的IsCancellationRequested财产?考虑下面的代码
static void Main(string[] args)
{
CancellationTokenSource tokenSource = new CancellationTokenSource();
var token = tokenSource.Token;
Console.WriteLine("Press Enter to Start.\nAgain Press enter to finish.");
Console.ReadLine();
Task t = new Task(() =>
{
int i = 0;
while (true)
{
if (token.IsCancellationRequested)
{
Console.WriteLine("Task Cancel requested");
break;
}
Console.WriteLine(i++);
}
}, token);
t.Start();
// wait for input before exiting
Console.ReadLine();
tokenSource.Cancel();
if(t.Status==TaskStatus.Canceled)
Console.WriteLine("Task was cancelled");
else
Console.WriteLine("Task completed");
}
Run Code Online (Sandbox Code Playgroud)
我发现在极少数情况下if块内的代码不运行。如果是这样,轮询查看是否请求取消有什么用?
SBCL分析显示我的一个Common Lisp哈希表函数耗费了大量时间.该函数比较两个哈希表以确定它们是否具有相同的键:
(defun same-keys (ht1 ht2)
"Returns t if two hash tables have the same keys."
(declare (hash-table ht1 ht2))
(when (= (hash-table-count ht1) (hash-table-count ht2))
(maphash (lambda (ht1-key ht1-value)
(declare (ignore ht1-value))
(unless (gethash ht1-key ht2)
(return-from same-keys nil)))
ht1)
t))
Run Code Online (Sandbox Code Playgroud)
有没有办法加速这个,因为哈希表总是#'eql带fixnum键?我也在加载lparallel库,但在这种情况下以某种方式并行化函数是否有意义?
编辑:哈希表的大小可以是大约10到100个条目.ht键范围从100扩展到999,999,999,999,但在此范围内实际使用的总可能的fixnums是稀疏的.每个ht值都是t或列表.所有哈希表的键值关联都在加载时设置.通过复制现有哈希表并逐步添加或删除条目,在运行时创建新哈希表.常规哈希表的读取,写入和复制似乎不是问题.
我正试图在两个内核上完全同时运行两个Python函数。每个进程都运行一个很长的循环(理论上是无限循环)。重要的是,它们必须同时保持同步,即使是最小的延迟也可能导致长期问题。
我认为我的问题是我像这样连续运行它们
# define the processes and assign them functions
first_process = multiprocessing.Process(name='p1', target='first_function')
second_process = multiprocessing.Process(name='p2', target='second_function')
# start the processes
first_process.start()
second_process.start()
Run Code Online (Sandbox Code Playgroud)
我time.time()在每个功能的开始处打印以测量时间差。输出结果是:
first function time: 1553812298.9244068
second function time: 1553812298.9254067
Run Code Online (Sandbox Code Playgroud)
差别是0.0009999275207519531秒。如前所述,这种差异将对长期产生重大影响。
综上所述,如何在两个不同的内核上完全同时运行两个功能?如果Python无法做到这一点,我还应该检查哪些其他选项?
python parallel-processing multiprocessing python-3.x python-multiprocessing
我打算在Python中并行处理for循环,如下所示,用于处理大型数据数组。线程/核心/节点上的并行化如何适合此代码,以及如何实现它?任何建议表示赞赏。谢谢!
所有输入都是具有以下典型大小的NumPy数组:
vector_data (int64): 1M x 3
matrix (float64): 0.1M x 0.1M x 3
Run Code Online (Sandbox Code Playgroud)
根据帖子的答案进行编辑:
对运行时性能的测试表明,这样做会multiprocessing导致速度显着下降,并且对内存的要求更高。
vector_data (int64): 1M x 3
matrix (float64): 0.1M x 0.1M x 3
Run Code Online (Sandbox Code Playgroud)
以下是样本运行的运行时成本:
vector_size = int(1E2)
matrix_size = int(1E1)
OP: 9.527e-02 sec
f1: 2.402e+00 sec (25.21x)
f2: 2.269e+00 sec (23.82x)
f3: 3.414e-02 sec (0.36x)
OP: 43.0 MiB
f1: 41.9 MiB (0.97x)
f2: 41.9 MiB (0.97x)
Run Code Online (Sandbox Code Playgroud)
vector_size = int(1E3)
matrix_size = int(1E2)
OP: 1.420e+00 sec
f1: 1.448e+01 sec (10.20x)
f2: 2.051e+01 sec (14.44x) …Run Code Online (Sandbox Code Playgroud)