- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
有没有办法确保 valarray
使用对齐内存,以便它可以用 SSE 和 AVX 进行矢量化?据我所知,STL 不保证对齐,您可以不将分配器传递给 valarray。还有其他方法可以实现吗?
提前致谢!
最佳答案
我通常使用 std::vector
使用我自己的分配器,它将对齐作为模板参数并调用 _mm_malloc()
或 _aligned_malloc()
.这非常有效,也适用于 AVX(32 字节对齐)。适当编写的模板化用户代码会自动选择所需的对齐方式。
下面的代码为AlignmentAllocator<>
和 helper 。在 gcc 和 icpc 下测试。
/// allocate and de-allocate aligned memory
template<std::size_t alignment>
struct static_allocator {
static void*allocate(std::size_t n)
{
if(n == 0) return 0;
if(n > max_size())
throw std::bad_alloc();
void*ret =
#if defined(__GNUC__) || defined (__INTEL_COMPILER)
_mm_malloc
#else
_aligned_malloc
#endif
(n,alignment);
if(!ret)
throw std::bad_alloc();
return ret;
}
static void deallocate(void*p)
{
#if defined(__GNUC__) || defined (__INTEL_COMPILER)
_mm_free
#else
_aligned_free
#endif
(p);
}
static std::size_t max_size ()
{ return std::numeric_limits<std::size_t>::max(); }
};
/// allocate and de-allocate unaligned memory
template<>
struct static_allocator<1> {
static std::size_t max_size () noexcept
{ return std::numeric_limits<std::size_t>::max(); }
static void*allocate(std::size_t n)
{
if(n == 0) return 0;
void*ret = new char[n];
return ret;
}
static void deallocate(void*p)
{ delete[] static_cast<char*>(p); }
};
template<> struct static_allocator<0>;
/// allocator with explicit alignment
template<typename _Tp, std::size_t alignment = 16>
class AlignmentAllocator
{
typedef static_allocator<alignment> static_alloc;
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef _Tp* pointer;
typedef const _Tp* const_pointer;
typedef _Tp& reference;
typedef const _Tp& const_reference;
typedef _Tp value_type;
template <typename _Tp1>
struct rebind
{ typedef AlignmentAllocator<_Tp1, alignment> other; };
AlignmentAllocator() {}
AlignmentAllocator(const AlignmentAllocator&) {}
template <typename _Tp1>
AlignmentAllocator(const AlignmentAllocator<_Tp1, alignment> &) {}
~AlignmentAllocator() {}
pointer address (reference x) const
{
#if __cplusplus >= 201103L
return std::addressof(x);
#else
return reinterpret_cast<_Tp*>(&reinterpret_cast<char&>(x));
#endif
}
const_pointer address (const_reference x) const
{
#if __cplusplus >= 201103L
return std::addressof(x);
#else
return reinterpret_cast<const _Tp*>(&reinterpret_cast<const char&>(x));
#endif
}
pointer allocate (size_type n, const void* = 0)
{ return static_cast<pointer>(static_alloc::allocate(n*sizeof(value_type))); }
void deallocate (pointer p, size_type)
{ static_alloc::deallocate(p); }
size_type max_size () const
{ return static_alloc::max_size() / sizeof (value_type); }
#if __cplusplus >= 201103L
template<typename _Up, typename... _Args>
void construct(_Up* p, _Args&&... args)
{ ::new(static_cast<void*>(p)) _Up(std::forward<_Args>(args)...); }
template<typename _Up>
void destroy(_Up* p)
{ p->~_Up(); }
#else
void construct (pointer p, const_reference val)
{ ::new(static_cast<void*>(p)) value_type(val); }
void destroy (pointer p)
{ p->~value_type (); }
#endif
bool operator!=(const AlignmentAllocator&) const
{ return false; }
// Returns true if and only if storage allocated from *this
// can be deallocated from other, and vice versa.
// Always returns true for stateless allocators.
bool operator==(const AlignmentAllocator&) const
{ return true; }
};// class AlignmentAllocator<>
/// AlignmentAllocator<void> specialization.
template<std::size_t alignment>
class AlignmentAllocator<void, alignment>
{
public:
typedef size_t size_type;
typedef ptrdiff_t difference_type;
typedef void* pointer;
typedef const void* const_pointer;
typedef void value_type;
template<typename _Tp1>
struct rebind
{ typedef AlignmentAllocator<_Tp1, alignment> other; };
};
关于c++ - SSE/AVX 对齐内存上的 valarray,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13711649/
是的,这个has been asked before ,答案是: valarrays (value arrays) are intended to bring some of the speed of
看完这篇http://gcc.gnu.org/ml/libstdc++/2000-q1/msg00123.html ,似乎标准不能保证使用 valarrays 的 valarrays 是安全的。但是当
STL 中valarray::min 和valarray::max 函数的时间复杂度是多少? 此外,什么是查找各种其他 STL 组件的时间/空间复杂性的良好来源? 最佳答案 O(N) 这些函数不会缓存
这是我在这里的第一篇文章,但我经常阅读这里的各种主题。 现在我被 c++ 的编程问题困住了,它基本上是一个名为“Pair”的模板类,它应该包含 2 个 valarrays 的整数,然后包含在另一个名为
出于兼容性目的,我正在开发一个具有 C 接口(interface)的库 void interface(double* context, size_t num_elements); 而 context
我有一些数据存储在 std::vector 中.我用它来创建一个 std::valarray来 self 的 std::vector . std:valarray corpX(corps_tmp[i]
当我将 valarray 除以它的第一个元素时,只有第一个元素变为 1,其他元素保持其原始值。 #include #include using namespace std; int main()
为什么 std::valarray 不支持自定义分配器?它的内存管理是怎么设计的?是否使用了基于new 或malloc 的分配器?所有其他容器通常都提供指定自定义分配器的可能性。比如说,libstdc
valarray 是否有连续内存对齐? 我想通过传递 &myValarray[0] 将一个 valarray 传递给一个只接受指针的函数(来自 IPPS)。但因此我应该确定,valarray 的内存对
以下程序: #include #include using namespace std; int main() { int init[] = {1, 1}; // Example 1 va
当我用 valarray 写一个简单的算术表达式时并将结果分配给 auto当我尝试在 gcc 上访问结果时出现段错误。 #include #include using std::ostream;
std::valarray myArray(3)产生 valarray长度为 3,初始化为零。 std::valarray myArray(1,3)产生 valarray长度为 3,初始化为 1。 s
我们可以初始化一个valarray来自基本的用户定义数组,如下所示: int arr[3]={0}; valarray test(arr, sizeof(arr)/sizeof(int)); 我们怎样
在下面的类中,当我尝试为 operator [] 返回 std::valarray& 时,它说:invalid initialization of std::valarray& from R - 值引
我发布了一个用 C++ 编写的简单的 n-body 类 here在代码审查中。 我被告知要使用 std::valarray 而不是普通的 std::array ,目的是我可以重写一些目前看起来像这样的
我在一个列表中有很多数据,比如每个元素有几千字节,我想逐个提取以进行一些数字处理。这些数据最初存储为 float[]。由于处理涉及大量索引和全局计算,我认为 valarray 可能易于编程。但是如果我
您好,我想构建一个辅助类来初始化一个 STL valarray。我想要的是执行以下操作: std::valarray vec(3); vlist_of(vec)(2)(3)(5); 所以我可以只使用一
我正在寻找静态大小的 std::valarray 实现。 我自己实现应该很容易,但我需要 constexpr 操作(加法、减法等),这有点无聊/容易出错,所以我在这里问一下是否有流行的实现。 如果我必
代码: #include #include using namespace std; int main() { valarray v0(2, 4); valarray v1; v
这可能是个愚蠢的问题。 关于 this我读过的网站 The valarray specification allows for libraries to implement it with sever
我是一名优秀的程序员,十分优秀!