| #ifndef OPENPOSE_PRIVATE_UTILITIES_AVX_HPP |
| #define OPENPOSE_PRIVATE_UTILITIES_AVX_HPP |
|
|
| |
| |
| |
| |
|
|
| #ifdef WITH_AVX |
| #include <cstdint> |
| #include <memory> |
| #include <immintrin.h> |
| #include <openpose/utilities/errorAndLog.hpp> |
|
|
| namespace op |
| { |
| #ifdef __GNUC__ |
| #define ALIGN32(x) x __attribute__((aligned(32))) |
| #elif defined(_MSC_VER) |
| #define ALIGN32(x) __declspec(align(32)) |
| #else |
| #error Unknown environment! |
| #endif |
|
|
| |
| |
| |
| |
| |
| typedef unsigned long long offset_t; |
| #define PTR_OFFSET_SZ sizeof(offset_t) |
| #ifndef align_up |
| #define align_up(num, align) \ |
| (((num) + ((align) - 1)) & ~((align) - 1)) |
| #endif |
| inline void * aligned_malloc(const size_t align, const size_t size) |
| { |
| void * ptr = nullptr; |
|
|
| |
| |
| |
| if (align && size && (align & (align - 1)) == 0) |
| { |
| |
| |
| const auto hdr_size = PTR_OFFSET_SZ + (align - 1); |
| void * p = malloc(size + hdr_size); |
|
|
| if (p) |
| { |
| |
| |
| ptr = (void *) align_up(((uintptr_t)p + PTR_OFFSET_SZ), align); |
|
|
| |
| *((offset_t *)ptr - 1) = (offset_t)((uintptr_t)ptr - (uintptr_t)p); |
|
|
| } |
| } |
|
|
| if (ptr == nullptr) |
| { |
| error("Shared pointer could not be allocated for Array data storage.", |
| __LINE__, __FUNCTION__, __FILE__); |
| } |
|
|
| return ptr; |
| } |
| inline void aligned_free(void * ptr) |
| { |
| if (ptr == nullptr) |
| error("Received nullptr.", __LINE__, __FUNCTION__, __FILE__); |
|
|
| |
| |
| offset_t offset = *((offset_t *)ptr - 1); |
|
|
| |
| void * p = (void *)((uint8_t *)ptr - offset); |
| free(p); |
| } |
| template<class T> |
| std::shared_ptr<T> aligned_shared_ptr(const size_t size) |
| { |
| try |
| { |
| return std::shared_ptr<T>(static_cast<T*>( |
| aligned_malloc(8*sizeof(T), sizeof(T)*size)), &aligned_free); |
| } |
| catch (const std::exception& e) |
| { |
| error(e.what(), __LINE__, __FUNCTION__, __FILE__); |
| return std::shared_ptr<T>{}; |
| } |
| } |
| } |
| #endif |
|
|
| #endif |
|
|