我正在使用pthreads编写一个C程序,在二维矩阵上进行波前模式计算。为了获得良好的性能,我以交错的方式向每个线程分配几行,如下所示:
线程0 ------------------
主题1 ------------------
主题2 ------------------
主题3 ------------------
线程0 ------------------
主题1 ------------------
主题2 ------------------
主题3 ------------------
等
在这个计算中,我认为这是唯一可行的分割,因为每个线程需要在每一行上计算的新值,并且在它们可用之前不能进一步移动。 现在,这里的问题是线程1需要在其行上由线程0计算的值,因此它必须在线程0后面跟踪而不是在它之前。为此,我将每一行分成块并用一个关键部分保护每个块。计算如下:
线程0 -----------
主题1 ------
线程2 ---
总是我必须排在第i行后面。我希望你理解这个想法。 我已经实现了这个想法,我正在一台双核四核系统的机器上进行测试。我遇到了奇怪的行为。结果是正确计算的,但运行时间在连续时间的8倍以内,最多超过连续时间。实际上,12000 x 12000矩阵的连续时间为16秒,并行运行时间为2到17秒之间,并且通常在连续两次运行时有所不同。
我最初的想法是,这个问题非常敏感,所以当然,如果我们说线程0和线程1安排在不同的物理处理器上,我可能会遇到糟糕的性能。在/ proc / cpuinfo中查看,我推断出核心被映射为0,2,4,6在处理器0上,而1,3,5,7在处理器1上。 然后,在创建线程时,我使用pthread_setaffinity_np来设置右核心上的线程的亲和性。然而,没有任何改变。我也尝试过使用pthread_attr_setaffinity_np和sched_setaffinity,但我得到了相同的随机运行时间。
内核忽略了我的亲和力调用,或者这不是问题。 我真的希望有人可以帮助我,因为我已经没有想法了。谢谢。
答案 0 :(得分:7)
内核不会忽略你的亲和力调用,这不是问题。
似乎缓存未命中。如果您的线程没有通过相同的数据互连,您可以在行之间的内存中留出很大的差距,以避免这种情况。
尝试制作单行数据块(64字节) 尝试使线程0经过64个字节,并且只有在该线程1将从同一个地方读取之后 - 依此类推。