首页 > 解决方案 > 模拟 XMM 内在函数时 WebAssembly 中的对齐检查?

问题描述

我正在尝试使用模拟 SSE 内在函数的选项将 PFFFT 库 ( https://bitbucket.org/jpommier/ ) 编译为 WebAssembly 。-msse编译工作正常,但有一个对齐检查在运行时失败。

失败的对齐检查宏是:

# define VALIGNED(ptr) ((((long)(ptr)) & 0xF) == 0)

我在这里有点迷失了......有没有人暗示如何使用 WASM SIMD 执行对齐检查,或者是否有必要?

最好的,n

标签: csimdwebassemblymemory-alignmentemscripten

解决方案


我假设您正在编写 C 并编译为 WASM - 如果您还从 C 调用 PFFFT 库,我并不完全清楚。

在第 1622 + 1707 行读取PFFFT 代码,只有两个地方可能使您描述的宏失败(VALIGNED(ptr)):

  1608  void pffft_transform_internal(PFFFT_Setup *setup, const float *finput, float *foutput, v4sf *scratch,
  1609                               pffft_direction_t direction, int ordered) {
   ...
  1622    assert(VALIGNED(finput) && VALIGNED(foutput));
                 ^^^^^^^^^^^^^^^^    ^^^^^^^^^^^^^^^^^
  1623  
   ...

  1677  void pffft_zconvolve_accumulate(PFFFT_Setup *s, const float *a, const float *b, float *ab, float scaling) {
   ...
  1707    assert(VALIGNED(a) && VALIGNED(b) && VALIGNED(ab));
                 ^^^^^^^^^^^    ^^^^^^^^^^^    ^^^^^^^^^^^^
   ...

所以“故障”可以放在调用者pffft_transform_internal(...)pffft_zconvolve_accumulate(...):)输入指针没有正确对齐。

如果您自己分配float-arrays,您是自己使用aligned_alloc()还是模拟它?(它又快又容易!:))

根据@Peter Cordes 的说法,您还可以考虑使用删除/禁用的宏进行测试。


推荐阅读