如果我正在对矩阵进行逐个元素的操作M
,例如M[i, j] *= (1 - M[i, j])
,是否可以为每个元素启动一个线程(i, j)
?我只是担心在什么时候启动线程的开销超过了实现的并行性。
问问题
92 次
1 回答
1
如果可能的话,尝试为每个线程做更多的工作通常是一个更好的主意,以实现指令级并行性。如果给定线程执行多个独立的操作,则指令可以流水线化并在没有停顿的情况下执行,这将增加您的算术吞吐量。相反,如果您让每个线程做一件(微不足道的)工作,那么就没有机会进行任何类型的指令级并行,也没有机会隐藏任何内存延迟时间。
此外,可用的寄存器数量有限,因此启动的线程越多,每个线程可用的寄存器数量就越少。我不确定 Kepler 卡,但是在 Fermi 卡一代中,寄存器的带宽大约是共享内存的 8 倍,所以尽可能使用寄存器很重要(再说一次,我没有开普勒卡,所以我没有'不知道这是否已经改变)。
虽然有点过时,但这里详述的建议仍然非常相关
于 2013-05-07T22:11:50.497 回答