Fix the alignment problem

This commit is contained in:
Jean Pierre Cimalando 2020-04-02 15:35:21 +02:00
parent f32f14dfa2
commit bcb0c91599
4 changed files with 14 additions and 18 deletions

View file

@ -5,7 +5,6 @@
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz // If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
#include "ResonantArrayAVX.h" #include "ResonantArrayAVX.h"
#include "ResonantStringAVX.h"
#include "Config.h" #include "Config.h"
#include <cstring> #include <cstring>
@ -30,9 +29,9 @@ void ResonantArrayAVX::setup(
const float feedbacks[], const float gains[]) const float feedbacks[], const float gains[])
{ {
const unsigned numStringPacks = (numStrings + avxVectorSize - 1) / avxVectorSize; const unsigned numStringPacks = (numStrings + avxVectorSize - 1) / avxVectorSize;
ResonantStringAVX* stringPacks = new ResonantStringAVX[numStringPacks]; _stringPacks.resize(numStringPacks);
ResonantStringAVX* stringPacks = _stringPacks.data();
_stringPacks.reset(stringPacks);
_numStrings = numStrings; _numStrings = numStrings;
for (unsigned p = 0; p < numStringPacks; ++p) { for (unsigned p = 0; p < numStringPacks; ++p) {
@ -65,18 +64,18 @@ void ResonantArrayAVX::setSamplesPerBlock(unsigned samplesPerBlock)
void ResonantArrayAVX::clear() void ResonantArrayAVX::clear()
{ {
ResonantStringAVX* stringPacks = _stringPacks.get(); ResonantStringAVX* stringPacks = _stringPacks.data();
const unsigned numStringPacks = (_numStrings + avxVectorSize - 1) / avxVectorSize; const unsigned numStringPacks = (_numStrings + avxVectorSize - 1) / avxVectorSize;
for (unsigned p = 0; p < numStringPacks; ++p) { for (unsigned p = 0; p < numStringPacks; ++p) {
ResonantStringAVX& rs = stringPacks[p]; ResonantStringAVX& rs = reinterpret_cast<ResonantStringAVX&>(stringPacks[p]);
rs.clear(); rs.clear();
} }
} }
void ResonantArrayAVX::process(const float *inPtr, float *outPtr, unsigned numFrames) void ResonantArrayAVX::process(const float *inPtr, float *outPtr, unsigned numFrames)
{ {
ResonantStringAVX* stringPacks = _stringPacks.get(); ResonantStringAVX* stringPacks = _stringPacks.data();
const unsigned numStringPacks = (_numStrings + avxVectorSize - 1) / avxVectorSize; const unsigned numStringPacks = (_numStrings + avxVectorSize - 1) / avxVectorSize;
// receive 8 resonator outputs per pack // receive 8 resonator outputs per pack
@ -84,7 +83,7 @@ void ResonantArrayAVX::process(const float *inPtr, float *outPtr, unsigned numFr
std::memset(outputs8, 0, numFrames * sizeof(__m256)); std::memset(outputs8, 0, numFrames * sizeof(__m256));
for (unsigned p = 0; p < numStringPacks; ++p) { for (unsigned p = 0; p < numStringPacks; ++p) {
ResonantStringAVX& rs = stringPacks[p]; ResonantStringAVX& rs = reinterpret_cast<ResonantStringAVX&>(stringPacks[p]);
for (unsigned i = 0; i < numFrames; ++i) for (unsigned i = 0; i < numFrames; ++i)
outputs8[i] = _mm256_add_ps( outputs8[i] = _mm256_add_ps(
outputs8[i], rs.process(_mm256_broadcast_ss(&inPtr[i]))); outputs8[i], rs.process(_mm256_broadcast_ss(&inPtr[i])));

View file

@ -6,6 +6,7 @@
#pragma once #pragma once
#include "ResonantArray.h" #include "ResonantArray.h"
#include "ResonantStringAVX.h"
#include "Buffer.h" #include "Buffer.h"
#include "SIMDConfig.h" #include "SIMDConfig.h"
@ -13,8 +14,6 @@
namespace sfz { namespace sfz {
namespace fx { namespace fx {
class ResonantStringAVX;
class ResonantArrayAVX final : public ResonantArray { class ResonantArrayAVX final : public ResonantArray {
public: public:
ResonantArrayAVX(); ResonantArrayAVX();
@ -32,7 +31,7 @@ public:
void process(const float *inPtr, float *outPtr, unsigned numFrames) override; void process(const float *inPtr, float *outPtr, unsigned numFrames) override;
private: private:
std::unique_ptr<ResonantStringAVX[]> _stringPacks; Buffer<ResonantStringAVX, 32> _stringPacks;
unsigned _numStrings = 0; unsigned _numStrings = 0;
Buffer<float, 32> _workBuffer; Buffer<float, 32> _workBuffer;
}; };

View file

@ -5,7 +5,6 @@
// If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz // If not, contact the sfizz maintainers at https://github.com/sfztools/sfizz
#include "ResonantArraySSE.h" #include "ResonantArraySSE.h"
#include "ResonantStringSSE.h"
#include "Config.h" #include "Config.h"
#include <cstring> #include <cstring>
@ -30,9 +29,9 @@ void ResonantArraySSE::setup(
const float feedbacks[], const float gains[]) const float feedbacks[], const float gains[])
{ {
const unsigned numStringPacks = (numStrings + sseVectorSize - 1) / sseVectorSize; const unsigned numStringPacks = (numStrings + sseVectorSize - 1) / sseVectorSize;
ResonantStringSSE* stringPacks = new ResonantStringSSE[numStringPacks]; _stringPacks.resize(numStringPacks);
ResonantStringSSE* stringPacks = _stringPacks.data();
_stringPacks.reset(stringPacks);
_numStrings = numStrings; _numStrings = numStrings;
for (unsigned p = 0; p < numStringPacks; ++p) { for (unsigned p = 0; p < numStringPacks; ++p) {
@ -65,7 +64,7 @@ void ResonantArraySSE::setSamplesPerBlock(unsigned samplesPerBlock)
void ResonantArraySSE::clear() void ResonantArraySSE::clear()
{ {
ResonantStringSSE* stringPacks = _stringPacks.get(); ResonantStringSSE* stringPacks = _stringPacks.data();
const unsigned numStringPacks = (_numStrings + sseVectorSize - 1) / sseVectorSize; const unsigned numStringPacks = (_numStrings + sseVectorSize - 1) / sseVectorSize;
for (unsigned p = 0; p < numStringPacks; ++p) { for (unsigned p = 0; p < numStringPacks; ++p) {
@ -76,7 +75,7 @@ void ResonantArraySSE::clear()
void ResonantArraySSE::process(const float *inPtr, float *outPtr, unsigned numFrames) void ResonantArraySSE::process(const float *inPtr, float *outPtr, unsigned numFrames)
{ {
ResonantStringSSE* stringPacks = _stringPacks.get(); ResonantStringSSE* stringPacks = _stringPacks.data();
const unsigned numStringPacks = (_numStrings + sseVectorSize - 1) / sseVectorSize; const unsigned numStringPacks = (_numStrings + sseVectorSize - 1) / sseVectorSize;
// receive 4 resonator outputs per pack // receive 4 resonator outputs per pack

View file

@ -6,6 +6,7 @@
#pragma once #pragma once
#include "ResonantArray.h" #include "ResonantArray.h"
#include "ResonantStringSSE.h"
#include "Buffer.h" #include "Buffer.h"
#include "SIMDConfig.h" #include "SIMDConfig.h"
@ -13,8 +14,6 @@
namespace sfz { namespace sfz {
namespace fx { namespace fx {
class ResonantStringSSE;
class ResonantArraySSE final : public ResonantArray { class ResonantArraySSE final : public ResonantArray {
public: public:
ResonantArraySSE(); ResonantArraySSE();
@ -32,7 +31,7 @@ public:
void process(const float *inPtr, float *outPtr, unsigned numFrames) override; void process(const float *inPtr, float *outPtr, unsigned numFrames) override;
private: private:
std::unique_ptr<ResonantStringSSE[]> _stringPacks; Buffer<ResonantStringSSE, 16> _stringPacks;
unsigned _numStrings = 0; unsigned _numStrings = 0;
Buffer<float, 16> _workBuffer; Buffer<float, 16> _workBuffer;
}; };