并行应用程序具有随机行为

Tud*_*dor 4 c parallel-processing multithreading pthreads

我正在使用pthreads编写一个C程序,在二维矩阵上进行波前模式计算.为了获得良好的性能,我以交错的方式向每个线程分配几行,如下所示:

线程0 ------------------

线程1 ------------------

线程2 ------------------

线程3 ------------------

线程0 ------------------

线程1 ------------------

线程2 ------------------

线程3 ------------------

等等

在这个计算中,我认为这是唯一可行的分割,因为每个线程需要在每一行上计算的新值,并且在它们可用之前不能进一步移动.现在,这里的问题是线程1需要在其行上由线程0计算的值,因此它必须在线程0后面跟踪而不是在它之前.为此,我将每一行分成块并用一个关键部分保护每个块.计算如下:

线程0 -----------

线程1 ------

线程2 ---

总是我必须排在第i - 1行后面.我希望你理解这个想法.我实现了这个想法,我正在一台双核四核系统的机器上进行测试.我遇到了奇怪的行为.结果是正确计算的,但运行时间在连续时间的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,但我得到了相同的随机运行时间.

内核忽略了我的亲和力调用,或者这不是问题.我真的希望有人可以帮助我,因为我已经没有想法了.谢谢.

DiV*_*Van 7

内核不会忽略你的亲和力调用,这不是问题.

好像缓存未命中.如果您的线程没有通过相同的数据互连,您可以在线路之间的内存中留出很大的差距,以避免这种情况.

尝试制作单行数据大小(64字节)尝试使线程0通过64字节,并且只有在该线程1将从同一位置读取之后 - 依此类推.