我想比较使用不同过程(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&gt; 4> 1。
1
elapsed 5147.936000 ms
2
elapsed 2821.225000 ms
4
elapsed 3129.096000 ms
我无法弄明白。
答案 0 :(得分:1)
我会说你在双核上运行 如果您有核心可以处理每个流程,则通过各种流程拆分工作负载只会有所帮助 否则,处理器内核将花费时间来切换进程上下文,而不是处理任务本身。
您的问题也可能太小,使用并行处理的开销会克服其优势。如果是这种情况,运行具有更大矩阵的4个进程最终将比1和2进程版本更高效。