3

我正在试用 Intel MKL,它们似乎有自己的内存管理(C 风格)。

他们建议将他们的 MKL_malloc/MKL_free 对用于向量和矩阵,我不知道什么是处理它的好方法。原因之一是建议内存对齐至少为 16 字节,并且通过这些例程明确指定。

我过去常常依赖 auto_ptr 和 boost::smart_ptr 来忘记内存清理。

如何使用 MKL 内存管理编写异常安全程序,或者我应该只使用常规 auto_ptr 而不打扰?

提前致谢。

编辑 http://software.intel.com/sites/products/documentation/hpc/mkl/win/index.htm

这个链接可以解释我为什么提出这个问题

更新

我从下面的答案中使用了分配器的想法。这就是我现在所拥有的:

template <typename T, size_t TALIGN=16, size_t TBLOCK=4>
class aligned_allocator : public std::allocator<T>
{
public:
 pointer allocate(size_type n, const void *hint)
 {
  pointer p = NULL;
  size_t count = sizeof(T) * n;
  size_t count_left = count % TBLOCK;
  if( count_left != 0 ) count += TBLOCK - count_left;
  if ( !hint ) p = reinterpret_cast<pointer>(MKL_malloc (count,TALIGN));
  else   p = reinterpret_cast<pointer>(MKL_realloc((void*)hint,count,TALIGN));
  return p;
     } 
 void deallocate(pointer p, size_type n){ MKL_free(p); }
};

如果有人有任何建议,请随时改进。

4

2 回答 2

2

您可以将 a与此处std::vector提到的自定义分配器一起使用,以确保 16 字节对齐。然后您可以将第一个元素的地址作为 MKL 函数的输入指针。由于 MKL 广泛使用 SIMD 来提高性能,因此具有 16 字节对齐非常重要。

于 2010-03-11T07:20:26.627 回答
2

使用 C++ new[] 运算符分配内存,但保留额外的 15 个字节用于对齐。然后创建某种包装器,它返回/包含从第一个 16 字节边界开始的智能指针的内存地址。这会产生 16 字节对齐的内存。

template
T* address16(T *address) { return (T*)((char*)address + 15) & ~0xf); }
于 2010-03-11T06:38:40.973 回答