【发布时间】:2021-01-19 12:17:16
【问题描述】:
我正在开发一个关于 Xilinx Vitis 的项目,我使用该项目创建了一个 arrayA
std::vector<uint8_t,aligned_allocator<uint8_t>> arrayA(size);
然后我用一些随机值填充它。
我需要将它传递给接受( ap_uint<128>* arrayA)的内核
如何正确链接这些?
我尝试过创建一个
ap_uint<128>* temp_A = arrayA.data()
但这也给了我一个错误。
当我运行代码时,它会给我一个针对 XRT XILINX Vitis 的未对齐主机分配器警告
我该如何解决这个问题?
编辑:uint8_t 是无符号字符
【问题讨论】:
-
您为什么认为将
uint8_t内存块转换为ap_uint<128>块是安全的? -
@AndrewHenle 我正在使用的项目的旧版本使用了这些数据类型,所以我认为我不需要修改原始代码但似乎无法找出正确的方法
-
原始代码是错误的 - 有几个原因使得做这样的事情不安全。它可能违反对齐限制,并且始终是严格混叠违规。请参阅Strict aliasing rule 和What is the strict aliasing rule? 编写原始代码的人可能是在 x86 系统上学到的,这些系统对未对齐的访问更加宽容。有 很多 的开发者不知道这些限制
-
@AndrewHenle 感谢您为我提供了那些很有见地的答案,当我阅读这些内容时,有什么可能的方法来解决这个问题?有很多函数使用 uint8_t 数据类型作为输入,所以我需要修改很多代码。当我将所有转换为整数类型时,它给了我一个 Segmentation Fault 的错误
-
最简单的就是
std::vector<ap_uint<128>> arrayA(size / sizeof(ap_uint<128>));