Как оценить требования к памяти GPU для реализации на основе тяги?
У меня есть 3 различных реализации, основанных на принципах тяги, которые выполняют определенные вычисления: первая - самая медленная и требует наименьшего количества памяти графического процессора, вторая - самая быстрая и требует большей части памяти графического процессора, а третья - промежуточная. Для каждого из них я знаю размер и тип данных для каждого используемого вектора устройства, поэтому я использую vector.size()*sizeof(тип), чтобы приблизительно оценить объем памяти, необходимый для хранения.
Таким образом, для данного ввода, основываясь на его размере, я бы хотел решить, какую реализацию использовать. Другими словами, определите самую быструю реализацию, которая поместится в доступной памяти GPU.
Я думаю, что для очень длинных векторов, с которыми я имею дело, размер vector.data(), который я вычисляю, является довольно хорошей оценкой, и остальная часть накладных расходов (если таковые имеются) может быть проигнорирована.
Но как бы я оценил накладные расходы на использование памяти (если они есть), связанные с реализацией алгоритмов тяги? В частности, я ищу такие оценки для преобразования, копирования, сокращения, redu_by_key и сбора. Меня не особо волнуют статические издержки, которые не зависят от размеров входных и выходных параметров алгоритма, если только они не очень значительны.
Я понимаю последствия фрагментации памяти графического процессора и т. Д., Но давайте на минуту оставим это в стороне.
Большое спасибо, что нашли время, чтобы разобраться в этом.
1 ответ
Thrust предназначен для использования в качестве черного ящика, и нет документации о накладных расходах памяти различных известных мне алгоритмов. Но это не похоже на очень трудную проблему, чтобы вывести ее эмпирически, выполнив несколько численных экспериментов. Вы можете ожидать, что потребление памяти для конкретного алогрита будет приблизительно таким:
total number of words of memory consumed = a + (1 + b)*N
за проблему с N
входные слова. Вот a
будут фиксированные накладные расходы алгоритма и 1+b
наклон наилучшего соответствия памяти по сравнению с N
линия. b
тогда количество служебных данных алгоритма на входное слово.
Таким образом, возникает вопрос, как контролировать использование памяти данным алгоритмом. Тяга использует внутреннюю вспомогательную функцию get_temporary_buffer
выделить внутреннюю память. Лучшей идеей было бы написать собственную реализацию get_temporary_buffer
который испускает размер, с которым он был вызван, и (возможно) использует вызов cudaGetMemInfo
чтобы получить статистику контекстной памяти в момент вызова функции. Вы можете увидеть некоторые конкретные примеры того, как перехватить get_temporary_buffer
звонки здесь.
Имея соответствующим образом оснащенный распределитель и некоторые из них работают с несколькими различными размерами проблем, вы должны быть в состоянии соответствовать приведенной выше модели и оценить b
значение для данного алгоритма. Затем модель может быть использована в вашем коде для определения безопасных максимальных размеров проблем для заданного объема памяти.
Я надеюсь, что это то, о чем вы спрашивали...