2017-02-13 11 views
1

У меня есть рабочий процесс с несколькими задачами, выполняющими вычисления, которые связаны через ребра данных; так что одна задача создает данные для другой задачи. Каждая задача связана с отдельным потоком. Одна из этих задач - получение памяти из пула памяти, который перерабатывается другой задачей, которая освобождает эту память.Как получить доступ к метаданным о памяти в C++

MemoryData используется в пуле памяти для хранения информации, например, при создании памяти (адресное пространство GPU/адресное пространство процессора) и правила выпуска (указывает, когда память может быть переработана).

Задача 1 получение памяти из пула:

std::shared_ptr<MemoryData<Type>> m = memGet<Type>("MemoryManagerName", ruleForReleasingMemory); 
// Store the memory to passed along with data 
data->setMemory(m); 

m должны быть переданы от задачи к задаче в данных до тех пор, пока не достигнет задачи, которая освобождает его.

Задача 2 освобождения памяти:

std::shared_ptr<MemoryData<Type>> m = data->getMemory(); 
memRelease("MemoryManagerName", m); 

То, что я пытаюсь сделать, это изменить тип возврата memGet просто вернуть Type. Затем во время выпуска он может использовать какой-либо метод, чтобы получить MemoryData для утилизации памяти. Это позволит мне упростить представление Data, поэтому мне не нужно хранить std::shared_ptr<MemoryData<Type>>.

До сих пор я рассматривал две конструкции:

(1) с использованием арифметики указателей использовать указатель на указатель ** и вычислить начальный адрес MemoryData оттуда.

(2) Создайте сопоставление между указателем на Type и указателем на MemoryData, это потребует отправки этой информации в каждую задачу, и если мне нужно добавить динамическое распределение памяти, тогда это будет немного сложнее

+6

Почему бирка C? C отличается от C++. выберите один –

+0

Я открыт для предложений от C или C++. Я нашел выполнение арифметики указателя внутри структуры проще, чем класс. – Jameshobbs

+5

Это не может быть язык C, потому что C не имеет 'std :: shared_ptr' или шаблонов. Я рекомендую удалить тег языка C. –

ответ

3

Нет (по умолчанию) метаданных о памяти (а если есть, то это специфическая реализация).

Вы можете написать свою собственную память allocator (выше существующих операционной системы примитивов как mmap(2) на Linux, которые также используются при malloc) и управлять ими, что метаданные самостоятельно.

Вы можете играть в трюки по адресу памяти (например, бит-и и-сдвигать вправо, отбрасывать как некоторые uintptr_t и т. Д.), Чтобы получить текущую арену или кусок памяти. Что я имею в виду, что если у вас есть произвольныйvoid* p указатель в то внутри зоны памяти, предоставленный вашим распределителем, вы можете использовать (uintptr_t)p >> 14, чтобы получить меньший индекс в некоторые из ваших мета-данных и т.д.

Конечно, такая обработка битов адреса зависит от процессора и операционной системы (зависит от размера страницы и того, как ОС обрабатывает их).

+0

В настоящее время у меня есть интерфейс распределителя, который используется для указания адресного пространства для распределения вещей в пуле, таких как 'cudaMalloc'. Написав мой собственный распределитель памяти в виде mmap, как это будет управлять примитивным 'double *' для 'Type'? Есть ли у вас пример использования бит-и-правого сдвига в памяти для получения фрагмента памяти? – Jameshobbs

+0

Вы не будете писать «mmap» -подобную вещь, вы бы * использовали * 'mmap' в своем распределителе –

+0

Вы можете перегружать новые и удалять операторы, глобально или локально. Однако перегрузка в глобальном масштабе приводит вас к извилистым дорожкам и разбросанным по полям полям, это не быстрое решение проблемы адресов. –

 Смежные вопросы

  • Нет связанных вопросов^_^