我想比较使用不同过程(1、2、4)的矩阵乘法
我使用 2 个进程的代码,fork 一次,让 child 成为父进程并进行 1/2 计算
if (cpid == 0) { /* Code executed by child */
for (int i = 0; i < dimension / 2; i++)
{
for (int j = 0; j < dimension; j++)
{
//matrix multiplication
}
}
exit(EXIT_SUCCESS);
} else { /* Code executed by parent */
for (int i = dimension / 2; i < dimension; i++)
{
for (int j = 0; j < dimension; j++)
{
//matrix multiplication
}
}
}
和4个进程的代码,fork一次,然后child和parent再次fork, 用4进程做1/4计算
cpid = fork();
if (cpid == 0)
{
cpid = fork();
if (cpid == 0)
{
for (int i = 0; i < dimension / 2; i++)
{
for (int j = 0; j < dimension / 2; j++)
{
//matrix multiplication
}
}
exit(EXIT_SUCCESS);
}
else{
for (int i = 0; i < dimension / 2; i++)
{
for (int j = dimension / 2; j < dimension; j++)
{
//matrix multiplication
}
}
exit(EXIT_SUCCESS);
}
}
else{
cpid = fork();
if (cpid == 0)
{
for (int i = dimension / 2; i < dimension; i++)
{
for (int j = 0; j < dimension / 2; j++)
{
//matrix multiplication
}
}
exit(EXIT_SUCCESS);
}
else{
for (int i = dimension / 2; i < dimension; i++)
{
for (int j = dimension / 2; j < dimension; j++)
{
//matrix multiplication
}
}
}
}
完整代码是:http://codepad.org/MmjRiBIN
令我惊讶的是速度是 2 > 4 > 1 。
1
elapsed 5147.936000 ms
2
elapsed 2821.225000 ms
4
elapsed 3129.096000 ms
我想不通。
最佳答案
我会说你在双核上运行。
仅当您有核心来处理每个流程时,将工作负载拆分到各个流程才会有所帮助。
否则,处理器内核将花费时间切换进程上下文,而不是处理任务本身。
您的问题也可能太小,使用并行处理的开销超过了它的好处。如果是这种情况,运行 4 个具有更大矩阵的进程最终将比 1 和 2 个进程版本的性能更高。
关于c - 四个进程执行速度比两个进程慢,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19785947/