InterlockedAdd on R32_Sint 负数
InterlockedAdd on R32_Sint with negative number
我正在使用 InterlockedAdd
写入 RWBuffer<int>
- 最初我有一个 RWBuffer<uint>
但有时我需要我的值变为负值。
我发现使用 InterlockedAdd
传递一个负数不会更新底层的 int 缓冲区 - 我通过对传入的值使用 abs() 来测试它,它起作用了。
我意识到使用 Add 方法添加负数可能看起来像“doh !你期望什么”但是没有 InterlockedSubtract()
所以 ...
这是一个已知问题吗,我只是还没找到相关文档,或者您通常会期望 InterlockedAdd(-1)
像我一样从 RWBuffer<int>
中减去 1?
我不确定类型化缓冲区如何处理原子,但它们肯定适用于结构化缓冲区。
在您的情况下,由于类型化缓冲区是 R32,因此它可以完美地映射到 int 结构化缓冲区。
语法为:
RWStructuredBuffer<int> OutputBuffer : register(u0);
那么互锁操作就像(例如,如果你想将它应用于第二个元素):
uint idx = 1;
uint current_value;
InterlockedAdd(OutputBuffer[idx],-1,current_value);
缓冲区的创建略有不同,但变化并不复杂(需要设置结构化标志并设置元素步幅,在这种情况下为 4)。
我正在使用 InterlockedAdd
写入 RWBuffer<int>
- 最初我有一个 RWBuffer<uint>
但有时我需要我的值变为负值。
我发现使用 InterlockedAdd
传递一个负数不会更新底层的 int 缓冲区 - 我通过对传入的值使用 abs() 来测试它,它起作用了。
我意识到使用 Add 方法添加负数可能看起来像“doh !你期望什么”但是没有 InterlockedSubtract()
所以 ...
这是一个已知问题吗,我只是还没找到相关文档,或者您通常会期望 InterlockedAdd(-1)
像我一样从 RWBuffer<int>
中减去 1?
我不确定类型化缓冲区如何处理原子,但它们肯定适用于结构化缓冲区。
在您的情况下,由于类型化缓冲区是 R32,因此它可以完美地映射到 int 结构化缓冲区。
语法为:
RWStructuredBuffer<int> OutputBuffer : register(u0);
那么互锁操作就像(例如,如果你想将它应用于第二个元素):
uint idx = 1;
uint current_value;
InterlockedAdd(OutputBuffer[idx],-1,current_value);
缓冲区的创建略有不同,但变化并不复杂(需要设置结构化标志并设置元素步幅,在这种情况下为 4)。