Program Listing for File MixMachine-inl.h
↰ Return to documentation for file (include/audioRender/MixMachine/MixMachine-inl.h
)
#include "MixMachine.hpp"
#undef HWY_TARGET_INCLUDE
#define HWY_TARGET_INCLUDE "MixMachine-inl.h"
#include "hwy/foreach_target.h"
#include <hwy/highway.h>
#include "hwy/base.h"
namespace HWY_NAMESPACE{
HWY_ATTR
void
INTEGRATE_PCM_SIMD(
SIMD_FLOAT& tempVec,
std::mutex& renderLock,
std::vector<float>& rendered_out,
MUSIC_CTR *& MC)
{
const hwy::HWY_NAMESPACE::ScalableTag<float> hwyFTag;
auto laneSize = hwy::HWY_NAMESPACE::Lanes(hwyFTag);
auto times = tempVec.size() / laneSize;
auto remained = tempVec.size() % laneSize;
auto Tptr = tempVec.data();
{
std::lock_guard<std::mutex> locks(renderLock);
if(rendered_out.size() < (MC->QDatas.pos.back().Gidx * CHANNEL)){
rendered_out.resize((MC->QDatas.pos.back().Gidx * CHANNEL));
}
auto Rptr = rendered_out.data() + (MC->QDatas.pos.front().Gidx * CHANNEL);
for(size_t L = 0; L < times; ++L){
auto Tsimd = hwy::HWY_NAMESPACE::Load(hwyFTag, Tptr);
auto Rsimd = hwy::HWY_NAMESPACE::LoadU(hwyFTag, Rptr);
hwy::HWY_NAMESPACE::StoreU(Rsimd + Tsimd, hwyFTag, Rptr);
Tptr += laneSize;
Rptr += laneSize;
}
for(size_t REM = 0; REM < remained; ++REM){
(*(Rptr++)) += (*(Tptr++));
}
}
}
}