2013-10-28 80 views
1

想知道为什么将一个for循环分成两个这样的线程会使我的性能下降几乎减少一倍?我正在使用双核处理器。多线程for循环在C

正常循环(1.78 S):

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 S):

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

它可能与内存访问有关吗?我试图从循环中删除内存访问,然后回去测试我的单线程和双线程循环,看看是否有速度增加,然后加回内存读取和基准,然后加回写入和基准?我没有这方面的经验;这只是我将如何处理故障排除。 –

+1

实际上,我首先想知道它是否使用了两个内核 - 您正在运行哪些操作系统,是否在单个进程内分割内核,在什么条件下等等。 –

+0

“相同的性能”意味着它在两秒内运行?或半个小时?要么? – Macattack

回答

1

我想通了。我使用全局变量(i,j,k,x,y,z等)来遍历循环。我没有在例子中显示,所以你不会知道。这显然增加了很多开销。现在它可以正常使用每个线程的局部变量。

+0

是的,这解释了很多......我希望告诉你为什么[SSCCE](http://meta.stackexchange.com/q/22754)是个好主意。 :-) – torek

+0

这不是真正的问题答案,因为它只是说代码改变时软件行为有所不同,没有解释为什么。您认为添加的开销的来源是什么?在问题的源代码中,循环变量i,j和k全都是局部变量,就像变量var一样。变量n,p和m没有在函数中定义,所以我假设它是全局的。那些全局变量是如何定义的? –

+0

n,p和m是宏。我不完全确定的解释。如果我猜测,这将是全局变量不分配给堆栈,这需要更长的访问时间,因为没有指向它们的指针...?这是一个更长的搜索。 – Riftus