c -对齐检查在WebAssembly时,模拟XMM的内在?



我试图编译PFFFT库(https://bitbucket.org/jpommier/)到WebAssembly使用-msse选项来模拟SSE本质。编译工作正常,但是在运行时有一个对齐检查失败。

失败的对齐检查宏为:

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

我有点迷路了…有没有人有一个关于如何执行与WASM SIMD对齐检查的提示,或者是否有必要?

最好的,n

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

阅读pffft代码在第1622 + 1707行,只有两个地方可能失败的宏你正在描述(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-数组,您是使用aligned_alloc()还是自己模拟它?(又快又容易!:))

根据@Peter Cordes,你也可以考虑在删除/禁用宏的情况下进行测试。

最新更新