【问题标题】:Multithreading for loop in CC中的多线程for循环
【发布时间】: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


【解决方案1】:

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

【讨论】:

  • 是的,这解释了很多......我希望能告诉你为什么SSCCE 是一个好主意。 :-)
  • 这并不是问题的真正答案,因为它只是说随着代码更改,软件行为会有所不同,但没有解释原因。您认为增加的开销的来源是什么?在问题的源代码中,循环变量 i、j 和 k 都是本地的,变量 var 也是如此。变量 n、p 和 m 未在函数中定义,因此我假设是全局变量。这些全局变量是如何定义的?
  • n、p 和 m 是宏。我不完全确定的解释。如果我猜测,这将是全局变量没有分配给堆栈,这需要更长的访问时间,因为没有指向它们的指针......?这是一个更长的搜索。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-06-17
  • 1970-01-01
  • 2011-08-20
  • 2023-03-03
  • 2013-02-24
  • 1970-01-01
相关资源
最近更新 更多