【发布时间】:2012-08-31 17:23:04
【问题描述】:
我想将两个带符号的 16 位整数打包/解包为一个 32 位整数。但是,我并没有让它完全发挥作用。
关于我可能做错了什么有什么想法吗?
template <typename T>
int read_s16(T& arr, int idx) restrict(amp)
{
return static_cast<int>((arr[idx/2] >> ((idx % 2) * 16)) << 16) >> 16;
}
template<typename T>
void write_s16(T& arr, int idx, int val) restrict(amp)
{
// NOTE: arr is zero initialized
concurrency::atomic_fetch_or(&arr[idx/2], (static_cast<unsigned int>(val) & 0xFFFF) << ((idx % 2) * 16));
}
函数返回/参数必须是我定义的。 lo 和 hi 是从不同的线程写入的(因此是 atomic_or),读取必须返回单个 32 位值。
目标平台不支持 16 位整数运算。
例子:
array<int> ar(1); // Container
write_s16(ar, 0, -16);
write_s16(ar, 1, 5);
assert(read_s16(ar, 0) == -16);
assert(read_s16(ar, 1) == 5);
【问题讨论】:
-
你能举一些输入和输出的例子吗?
-
我内心的某些东西反对将数据同时打包到单个
int... -
Kerrek SB:代码在 GPU 上运行。
-
您只是想存储它们并将它们传递给其他人吗?你如何处理这些迹象?你能把它放进一个 uint16_t[2] 吗?从您的问题看来,您只是将它们打包,所以我建议使用未签名的数据。
-
数据是有符号的,这让这有点复杂,它必须被放入一个无符号的 int 或 int 数组中。
标签: c++ c cuda bit-manipulation c++-amp