如果我在矩阵M
上执行逐元素操作,比如M[i, j] *= (1 - M[i, j])
,是否可以为每个元素(i, j)
启动一个线程?我只关心启动线程的开销大小超过了所实现的并行性。
答案 0 :(得分:1)
如果可能的话,尝试为每个线程做更多的工作通常是一个更好的主意,目标是具有指令级并行性。如果给定的线程执行多个独立的操作,则可以对指令进行流水线操作并执行而不会产生停顿,这将增加您的算术throuput。相反,如果你让每个线程做一件(微不足道的)工作,那么就没有机会进行任何类型的指令级并行操作,也没有机会隐藏任何内存延迟时间。
此外,可用的寄存器数量有限,因此启动的线程越多,每个线程可用的寄存器数就越少。我不确定开普勒卡,但回到费米卡一代,寄存器大约是共享内存带宽的8倍,所以尽可能使用寄存器很重要(再次,我没有kepler卡,所以我不喜欢我不知道这是否已经改变了。
虽然它有点过时,但详细here的建议仍然非常相关