【发布时间】:2017-04-02 20:58:12
【问题描述】:
我目前正处于用 C 语言编写多线程程序的入门阶段。我了解如何创建具有完全独立功能的独立线程,但我想了解该领域的程序员如何分解单个任务来完成多线程的优势。我已经完成了几个同步单独线程的练习,但是在分解单个任务并使其更快地使用多个线程时,这并没有什么好处。当谈到解决这些类型的问题并解释如何以及为什么你会以这种特定方式解决问题时,我真的很感激一些智慧。
例如,假设这是我试图用多个线程处理的任务。 [它将两个矩阵相乘,创建 n x p 维的 c 矩阵。] 还可以说我们可以输入我们想要在 1 和 t 之间运行的线程数(即使线程 >= 4 不会有显着的性能差异) 所以很明显如何攻击它。
for (i = 0; i < n; i++){
for (j = 0; j < p; j++){
c[i][j] = 0;
for (k = 0; k < m; k++){
c[i][j] += a[i][k] * b[k][j];
}
}
}
我的第一个想法是基本上根据线程数划分每个循环。所以,对于 t 个线程,
for (i = 0; i < n / t; i++){
for (j = 0; j < p / t; j++){
c[i][j] = 0;
for (k = 0; k < m / t; k++){
c[i][j] += a[i][k] * b[k][j];
}
}
}
然后将它们与信号量同步。但这必须将问题的每个部分分成不重叠或错过任何矩阵的 t 内聚线程。这似乎有点多,我觉得有更好的方法来攻击它。你们会怎么做呢?
【问题讨论】:
标签: c multithreading pthreads