【发布时间】:2013-01-30 14:55:42
【问题描述】:
我正在尝试使用 pthread 进行矩阵乘法,并为每一行的每次计算而不是每个元素创建一个线程。假设有两个矩阵 A[M][K],B[K][N] 。我哪里错了?
int A[M][K];
int B[K][N];
int C[][];
void *runner (void *param);
struct v
{
int i;
int j;
};
pthread_t tid[M];
for (i = 0; i < M; i++) // It should create M threads
{
struct v *data = (struct v *) malloc (sizeof (struct v));
data->i = i;
data->j = j;
pthread_create (&tid[count], &attr, runner, data);
pthread_join (tid[count], NULL);
count++;
}
runner (void *param) //
{
struct v *test;
int t = 0;
test = (struct v *) param;
for (t = 0; t < K; t++) // I want to compute it for a row instead of an element
{
C[test->i][test->j] = C[test->i][test->j] + A[test->i][t] * B[t][test->j];
}
pthread_exit (0);
}
【问题讨论】:
-
除了线程创建、销毁和同步会扼杀所有性能提升之外,还有更多? :)
-
记录一下,这是作业吗?如果不是,则对正在使用的平台使用内联汇编会更有效率。正如上面的@MichaelDorgan所说 - 线程开销很可能远远大于实际计算。到目前为止,您的代码有什么问题?它是运行/崩溃/段错误,还是给出了错误的答案?您能给我们提供几个样本运行吗?
-
顺便说一句,上面定义的 j、struct v、K 等在哪里?您剪切和粘贴的代码不足以让我们完全了解这里发生了什么。只有一个带有神秘命名变量的 for 循环并不能帮助我们理解发生了什么。更多代码请。
-
我已经做到了。之前是为每个元素创建线程,现在我将其修改为线程以计算结果矩阵的每一行。早些时候我在线程创建块中为行和列运行循环,现在我只运行一个行循环,但我很困惑如何修改下面的循环,因为一个线程计算一行结果矩阵
-
如果您已经有一个线程池设置等待工作分配,您可能会遇到性能提升,这种可能性会随着矩阵大小的增加而增加。但正如所写的那样,您很快就会发现(也许不是那么快)线程的设置/拆卸并不便宜。
标签: c multithreading matrix-multiplication