【问题标题】:Intel MKL memory management and exceptions英特尔 MKL 内存管理和异常
【发布时间】:2010-03-11 05:58:46
【问题描述】:

我正在试用 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); }
};

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

【问题讨论】:

  • 16-byte 对齐,我想。
  • 是的,绝对正确。已更正。

标签: c++ memory-management intel-mkl


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    template
    T* address16(T *address) { return (T*)((char*)address + 15) & ~0xf); }
    

    【讨论】:

      猜你喜欢
      • 2019-09-01
      • 1970-01-01
      • 2016-09-26
      • 2022-07-06
      • 1970-01-01
      • 2018-02-21
      • 2019-11-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多