parent
277dad6b3e
commit
7eac7837a3
@ -0,0 +1,8 @@
|
|||||||
|
all:
|
||||||
|
g++ mmw.cpp --std=c++1z -shared -fPIC -Ofast -march=native -g0 -s -o mmw.so
|
||||||
|
avx512:
|
||||||
|
g++ mmw.cpp --std=c++1z -shared -fPIC -Ofast -mavx512f -g0 -s -o mmw.so
|
||||||
|
debug:
|
||||||
|
g++ mmw.cpp --std=c++1z -shared -fPIC -O0 -march=native -g3 -o mmw.so
|
||||||
|
clean:
|
||||||
|
rm mmw.so -rf
|
@ -0,0 +1,48 @@
|
|||||||
|
|
||||||
|
#include <cstring>
|
||||||
|
#include <cstdlib>
|
||||||
|
#include <cstdint>
|
||||||
|
#include <deque>
|
||||||
|
|
||||||
|
using std::size_t;
|
||||||
|
using std::uint32_t;
|
||||||
|
|
||||||
|
template<class T, bool minmax>
|
||||||
|
void running(void *array, uint32_t len, uint32_t w){
|
||||||
|
using std::deque;
|
||||||
|
T* arr = static_cast<T*> (array);
|
||||||
|
deque<std::pair<T, uint32_t>> cache;
|
||||||
|
for(int i = 0; i < len; ++i){
|
||||||
|
if(!cache.empty() && cache.front().second == i-w) cache.pop_front();
|
||||||
|
if constexpr(minmax)
|
||||||
|
while(!cache.empty() && cache.back().first>arr[i]) cache.pop_back();
|
||||||
|
else
|
||||||
|
while(!cache.empty() && cache.back().first<arr[i]) cache.pop_back();
|
||||||
|
cache.push_back({arr[i], i});
|
||||||
|
arr[i] = cache.front().first;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
template<class T>
|
||||||
|
inline void mm(void *array, uint32_t len, uint32_t w, bool mm){
|
||||||
|
mm? running<T, true>(array, len, w) : running<T, false>(array, len, w);
|
||||||
|
}
|
||||||
|
extern "C" {
|
||||||
|
#include <stdio.h>
|
||||||
|
|
||||||
|
int mmw(void *array, unsigned long long misc[]){
|
||||||
|
char _ty = misc[0];
|
||||||
|
uint32_t len = misc[1];
|
||||||
|
uint32_t w = misc[2];
|
||||||
|
bool minmax = misc[3]-0x10000;
|
||||||
|
switch(_ty){
|
||||||
|
case 'F': mm<double>(array, len, w, minmax); break;
|
||||||
|
case 'C': case 'G': mm<unsigned char>(array, len, w, minmax); break;
|
||||||
|
case 'H': mm<unsigned short>(array, len, w, minmax); break;
|
||||||
|
case 'D': case 'I': mm<unsigned int>(array, len, w, minmax); break;
|
||||||
|
case 'T': case 'J': mm<long long>(array, len, w, minmax); break;
|
||||||
|
case 'L': if(len == 0) break;
|
||||||
|
default: printf("nyi %c\n", _ty);
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
Loading…
Reference in new issue