我有一个OpenMP程序(数千行,不可能在这里复制),其工作原理如下:
它由工作线程和任务队列组成。
任务由卷积组成;每当工作线程从工作队列中弹出任务时,它就执行所需的卷积,并可选择地将更多的卷积推到队列上。
(没有特定的“主”线程;所有工作人员都是平等的。)
当我在自己的机器()上运行这个程序时,我得到的运行时间是:
(#threads: running time)
1: 5374 ms
2: 2830 ms
3: 2147 ms
4: 1723 ms
5: 1379 ms
6: 1281 ms
7: 1217 ms
8: 1179 ms
这说得通。
然而,当我在NUMA 4
我目前正在优化代码的部分,因此执行一些基准测试。
我有NxN-matrices A和T,并希望将它们按元素相乘,并将结果再次保存在A中,即A = A*T。由于这段代码不可并行,所以我将赋值扩展为
!$OMP PARALLEL DO
do j = 1, N
do i = 1, N
A(i,j) = T(i,j) * A(i,j)
end do
end do
!$OMP END PARALLEL DO
(在中有完整的最小工作示例)
现在发生的奇怪的事情是,不管线程数量(在1到4之间),执行时间或多或少保持不变(+- 10%),但是CPU时间却随着线程数量的增加而增加
我正在编写一个套接字程序,它由一组从进程组成,这些进程将位于计算机集群中的每台计算机上,而主进程则指示它们将本地文件移动到远程节点上的远程从节点上。这些从进程的主要任务是从本地硬盘读取文件,并将它们传输到其他机器上的其他从进程。我希望将侦听文件数据和将文件数据发送到单个进程的功能。
是否有可能在同一进程中同时具有发送位和接收位?
//I want this to send a connect() request to every other slave node
initialize_Connections();
//Have an accept() call for accepting t