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