Cuda 线程是否可以自动更新共享内存的4个不同位置?

Cuda 线程是否可以自动更新共享内存的4个不同位置?,cuda,Cuda,假设一个内核线程试图更新共享内存中的4个不同位置。如果任何其他线程覆盖了这些位置中的任何一个,我是否可以导致该操作失败并反转?具体来说,这可以原子化执行吗 mem[a] = x; mem[b] = y; mem[c] = z; mem[d] = w; 没有,除了特殊情况。 在a、b、c和d是任意的(即不一定相邻)和/或x、y、z、w均为32位或更大的一般情况下,这不能原子地执行 我用原子论来指代 这样的操作限制为总共最多64位,因此4个32位或更大的数量无法工作。此外,所有数据必须是连续的和自

假设一个内核线程试图更新共享内存中的4个不同位置。如果任何其他线程覆盖了这些位置中的任何一个,我是否可以导致该操作失败并反转?具体来说,这可以原子化执行吗

mem[a] = x;
mem[b] = y;
mem[c] = z;
mem[d] = w;
没有,除了特殊情况。 在a、b、c和d是任意的(即不一定相邻)和/或x、y、z、w均为32位或更大的一般情况下,这不能原子地执行

我用原子论来指代

这样的操作限制为总共最多64位,因此4个32位或更大的数量无法工作。此外,所有数据必须是连续的和自然对齐的,因此独立的位置不能在单个原子周期中访问

在4个量为16位或8位量且相邻且对齐的特殊情况下,可以使用

可考虑的备选方案: 您可以使用来实现这些目标,可能需要付出相当大的性能成本、代码复杂性和脆弱性

另一种选择是重新编写算法,以使用某种形式的。由于您似乎是在threadblock级别操作,因此这可能是最好的方法。

否,特殊情况除外。 在a、b、c和d是任意的(即不一定相邻)和/或x、y、z、w均为32位或更大的一般情况下,这不能原子地执行

我用原子论来指代

这样的操作限制为总共最多64位,因此4个32位或更大的数量无法工作。此外,所有数据必须是连续的和自然对齐的,因此独立的位置不能在单个原子周期中访问

在4个量为16位或8位量且相邻且对齐的特殊情况下,可以使用

可考虑的备选方案: 您可以使用来实现这些目标,可能需要付出相当大的性能成本、代码复杂性和脆弱性


另一种选择是重新编写算法,以使用某种形式的。由于您似乎是在threadblock级别操作,这可能是最好的方法。

不,在a、b、c和d是任意的,和/或x、y、z、w都是32位或更大的一般情况下,它不能以原子方式执行。我所说的原子性是指使用硬件提供的原子RMW操作。您可以使用关键部分来实现这些功能,可能需要付出相当大的性能成本、代码复杂性和脆弱性。另一种选择是重铸算法,使用某种形式的并行简化。我明白了,谢谢。我将围绕这个限制重新思考我的算法。顺便说一句,这个评论看起来像是一个有效的答案。不,它不能原子地执行,在一般情况下,a、b、c和d是任意的,和/或x、y、z、w都是32位或更大的。我所说的原子性是指使用硬件提供的原子RMW操作。您可以使用关键部分来实现这些功能,可能需要付出相当大的性能成本、代码复杂性和脆弱性。另一种选择是重铸算法,使用某种形式的并行简化。我明白了,谢谢。我将围绕这个限制重新思考我的算法。顺便说一句,这个评论看起来是一个有效的答案。