Когда я запускаю профайлер против моего кода, часть продукции является:CUDA, профилированный, достигли очень низкого уровня; как диагностировать?
Limiting Factor
Achieved Occupancy: 0.02 (Theoretical Occupancy: 0.67)
IPC: 1.00 (Maximum IPC: 4)
Достигнутой заполняемость 0,02 кажется ужасно низкой. Возможно ли, что это связано с отсутствием файлов .csv из прогона профиля? Он жалуется:
Program run #18 completed.
Read profiler output file for context #0, run #1, Number of rows=6
Error : Error in profiler data file '/.../temp_compute_profiler_1_0.csv' at line number 1. No column found
Error in reading profiler output:
Application : "/.../bin/python".
Profiler data file '/.../temp_compute_profiler_2_0.csv' for application run 2 not found.
Read profiler output file for context #0, run #4, Number of rows=6
Мои блоки 32 * 4 * 1, сетка 25 * 100, и тестирование показало, что 32 регистров обеспечивает наилучшую производительность (несмотря на то, что результаты в разлив).
Если номер 0.02 верен, как я могу отладить, что происходит? Я уже пытался двигаться вероятными кандидатами на общую и/или постоянная память, экспериментируя с launch_bounds, перемещение данных в текстуры и т.д.
Edit: если больше данных из профиля перспективы будут полезно, просто дай мне знать и я могу это предоставить. Спасибо за прочтение.
Редактировать 2: запрошенные данные.
IPC: 1.00
Maximum IPC: 4
Divergent branches(%): 6.44
Control flow divergence(%): 96.88
Replayed Instructions(%): -0.00
Global memory replay(%): 10.27
Local memory replays(%): 5.45
Shared bank conflict replay(%): 0.00
Shared memory bank conflict per shared memory instruction(%): 0.00
L1 cache read throughput(GB/s): 197.17
L1 cache global hit ratio (%): 51.23
Texture cache memory throughput(GB/s): 0.00
Texture cache hit rate(%): 0.00
L2 cache texture memory read throughput(GB/s): 0.00
L2 cache global memory read throughput(GB/s): 9.80
L2 cache global memory write throughput(GB/s): 6.80
L2 cache global memory throughput(GB/s): 16.60
Local memory bus traffic(%): 206.07
Peak global memory throughput(GB/s): 128.26
The following derived statistic(s) cannot be computed as required counters are not available:
Kernel requested global memory read throughput(GB/s)
Kernel requested global memory write throughput(GB/s)
Global memory excess load(%)
Global memory excess store(%)
Achieved global memory read throughput(GB/s)
Achieved global memory write throughput(GB/s)
Решение (ы):
Проблема с отсутствующих данных было обусловлено значением слишком низкой тайм-аута; некоторые ранние прогоны данных истекут время и данные не будут записаны (и эти сообщения об ошибках будут потеряны в спаме последующих прогонов).
Достигнутая 0,02 занятость была вызвана active_warps
и active_cycles
(и, возможно, другими значениями), поражая максимальный (2 ** 32-1). Уменьшение размера ввода для профилированного скрипта привело к появлению гораздо более разумных значений (включая лучшие/более реалистичные IPC и ветвящиеся статистики).
Было бы интересно посмотреть, сколько времени потрачено на чтение и запись данных, а также на некоторый код ядра, чтобы узнать, что происходит. Не уверены в отсутствующих файлах csv, если они могут быть проблемой. EDIT: Другой интересный выход из профилировщика - это расходящиеся ветви, а также неизолированные и объединенные чтения/записи памяти. – martiert
Это данные, которые вы ищете? Значения не кажутся мне необоснованными; конечно, не нравится что-то при занятости 0,02. –
Плохое количество счетчиков для глобальной пропускной способности чтения/записи недоступно. Это странно, но помогло бы. Можете ли вы также указать код ядра? Я понятия не имею, что вы делаете ядро, или о том, как много работает.Я думаю, что у вас нет большого количества данных, хотя, возможно, это будет небольшая работа для GPU, если алгоритм не требует много работы. – martiert