share memory的赋值何时生效?

不可以。

你还是得用__syncthreads()或者volatile(分别针对block内和warp内通过shared的交换)。

前者(block内交换)是因为你总是需要同步的(光threadfence无法同步)才能读取,你再用个threadfence是在那里画蛇添足。

而warp内的则可以直接读取,无需用threadfence进行延迟一定周期,shared memory写完(我指真的执行了写入了,例如STS指令后立刻跟随LDS这种指令)后就能读的。

所以通过shared memory交换只需要分别__syncthreads(), 或者volatile即可(分别针对2种情况)。