我试图编译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,你也可以考虑在删除/禁用宏的情况下进行测试。