Cuda 矢量化原子外接程序单线程

Cuda 矢量化原子外接程序单线程,cuda,vectorization,atomic,Cuda,Vectorization,Atomic,SM能够执行以下操作:。这种能力可以通过让扭曲中的线程在相邻的内存位置上执行原子操作来利用 是否可以从一个线程在一个周期内执行多个原子操作 atomicAdd(addr + 0, val1); atomicAdd(addr + 1, val2); atomicAdd(addr + 2, val3); atomicAdd(addr + 3, val4); 上述代码作为四个独立的原子操作执行,而不是合并为一个向量原子操作 如果它不是原子的,那么就可以使用向量数据类型 float4 vec; vec

SM能够执行以下操作:。这种能力可以通过让扭曲中的线程在相邻的内存位置上执行原子操作来利用

是否可以从一个线程在一个周期内执行多个原子操作

atomicAdd(addr + 0, val1);
atomicAdd(addr + 1, val2);
atomicAdd(addr + 2, val3);
atomicAdd(addr + 3, val4);
上述代码作为四个独立的原子操作执行,而不是合并为一个向量原子操作

如果它不是原子的,那么就可以使用向量数据类型

float4 vec;
vec = *addr; // single load
vec.x += val1;
vec.y += val2;
vec.z += val3;
vec.w += val4;
*addr = vec; // single store


出于某种原因,
atomicAdd
对于向量类型并没有重载,即使它感觉是可能的(好吧,如果一个扭曲中的不同线程可以实现它,为什么一个线程不能?)。

不可能在同一个“周期”中从同一线程执行多个原子操作出于同样的原因,在正常添加、内存写入等情况下不可能实现相同的功能。。从一根线开始。没有针对它的指令(至少在PTX中)。这毫无意义,它必须使用一种完全独立的机制,而不是联合原子

聚合原子之所以能工作,是因为在一个扭曲中,所有线程都写入到类似的位置,这与正常的聚合内存操作类似。由于非发散线程执行相同的指令,因此某些调度机制更容易对这些内存写入进行分组(不必与所述线程同步)


你所说的是一种不同的机制,它要么需要一些硬件来任意预测一个warp中所有线程的写操作,要么一条指令封装了多个写操作,而这对于原子经济学在这里拥有某种特权是没有意义的

不,不是。。。(我不理解您的第二个代码,无论内存事务是否为原子事务,在一个周期内都不可能发生这种情况)不支持它有什么技术原因吗?如果硬件可以合并来自不同线程的原子添加,为什么不能有一条指令从同一线程执行呢?(就像普通向量类型一样)@talonmies-Oops!是的,第二个代码不会在一个周期内发生。这是一个糟糕的例子。不,这是一个规范的例子,正是因为(8位类型有几个例外),没有在线程级别执行宽向量算法的指令。如果没有针对非原子情况的指令,为什么也没有该字符的原子操作是不合逻辑的呢?在我的示例中,原子操作序列访问连续位置。SM可以将来自多个线程的32位常规加载合并为一个大加载。使用向量数据类型在单个线程中执行64/128位加载也可以实现类似的效果。我认为推测执行向量原子操作的可能性是合理的,因为SM可以从不同的线程合并。没有向量原子操作。GPU上任何原子操作的最大大小为64位。不能以任何方式组合多个64位位置。