Управление памятью Intel MKL и исключения - PullRequest
3 голосов
/ 11 марта 2010

Я пробую Intel MKL, и похоже, что у них есть собственное управление памятью (в стиле C).

Они предлагают использовать их пары MKL_malloc / MKL_free для векторов и матриц, и я не знаю, что является хорошим способом справиться с этим. Одной из причин этого является то, что для выравнивания памяти рекомендуется не менее 16 байт, и в этих подпрограммах это указывается явно.

Я привык полагаться на auto_ptr и boost :: smart_ptr, чтобы забыть об очистке памяти.

Как я могу написать безопасную для исключений программу с управлением памятью MKL или я должен просто использовать обычный auto_ptr и не беспокоиться?

Заранее спасибо.

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

эта ссылка может объяснить, почему я поднял вопрос

UPDATE

Я использовал идею из ответа ниже для распределителя. Вот что у меня сейчас:

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); }
};

Если у кого-то есть какие-либо предложения, не стесняйтесь, чтобы сделать это лучше.

Ответы [ 2 ]

2 голосов
/ 11 марта 2010

выделяет память с помощью оператора C ++ new [], но резервирует дополнительные 15 байтов для выравнивания. Затем создайте какую-нибудь оболочку, которая возвращает / содержит адрес памяти вашего умного указателя, начиная с первой 16-байтовой границы. В результате получается 16-байтовая выровненная память.

template
T* address16(T *address) { return (T*)((char*)address + 15) & ~0xf); }
1 голос
/ 11 марта 2010

Вы можете использовать std::vector с пользовательским распределителем, подобным упомянутым здесь , чтобы обеспечить 16-байтовое выравнивание. Тогда вы можете просто взять адрес первого элемента в качестве входного указателя на функции MKL. Важно, чтобы у вас было 16-байтовое выравнивание, поскольку MKL широко использует SIMD для производительности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...