【发布时间】:2013-11-07 22:59:13
【问题描述】:
想知道为什么像这样将 for 循环分成两个线程会使我的性能降低近一倍?我在双核处理器上运行。
正常循环(1.78 秒):
int var;
for (i = 0; i < n; i++)
for (j=0; j < p; j++){
var = 0;
for (k=0; k < m; k++)
var = i + k;
}
分循环(2.53 秒):
pthread_create(&tid[0], NULL, A, NULL);
pthread_create(&tid[1], NULL, B, NULL);
for (i=0; i < 2; i++) pthread_join(tid[i],NULL) == 0;
...
void * A(void *arg)
{
int i, j, k, var;
for (i = 0; i < n/2; i++)
for (j=0; j < p; j++)
{
var = 0;
for (k=0; k < m; k++)
var = i + k;
}
pthread_exit(NULL);
}
void * B(void *arg)
{
int i, j, k, var;
for (i = n/2; i < n; i++)
for (j=0; j < p; j++)
{
var = 0;
for (k=0; k < m; k++)
var = i + k;
}
pthread_exit(NULL);
}
【问题讨论】:
-
会不会和内存访问有关?我会尝试从循环中删除内存访问,然后返回并测试我的单线程和双线程循环,看看是否有速度提高,然后添加回内存读取和基准测试,然后添加回写入和基准测试?我没有这方面的经验;这就是我解决问题的方法。
-
实际上首先我想知道它是否甚至使用两个内核 - 你在什么操作系统上运行,它是否在内核之间拆分单进程线程,在什么条件下等等。
-
“相同的性能”意味着两者都在 1 秒内运行?还是半小时?还是?
-
不是您问题的答案,而是代码错误。
c[n/2][0..p]行是在每个线程中计算的,如果碰巧同时发生,您将在那里得到错误的结果。在线程 B 中的值i应该从n/2 + 1开始。 -
你是如何测量时间的?此外,如果您要回复某人的评论,请tag the person 以便他们收到通知。
标签: c multithreading loops multidimensional-array pthreads