Почему мое ядро ​​не выходит из строя, когда я использую чуть более 64 КБ постоянного кэша?(OpenCL / CUDA) - PullRequest
2 голосов
/ 04 ноября 2010

Я провел несколько тестов на моем ядре, которое использует постоянный кеш. Если я использую 16 000 поплавков (16 000 * 4 КБ = 64 КБ), то все идет гладко. Если я использую 16,200, он все еще работает гладко. Я получаю ошибки в своих результатах (не из OpenCL), если я использую 16 400 поплавков. Может ли быть так, что технически доступно 64.x КБ постоянного кеша? Должен ли я доверять своему коду, если я использую ровно 16 000 поплавков? Обычно я ожидаю, что код сломается, когда вы используете вещи до указанного предела.

Ответы [ 2 ]

3 голосов
/ 06 декабря 2010

Вы можете и должны запросить это с помощью API OpenCL clGetDeviceInfo с параметром CL_DEVICE_MAX_CONSTANT_BUFFER_SIZE. В спецификации OpenCL 1.1 говорится, что соответствующая реализация должна предоставлять не менее 64 Кбайт, что, вероятно, и реализует ваше устройство.

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

Если это не возвращает ошибку, но дает плохие результаты, это ошибка в вашей реализации OpenCL. Не слишком удивительно, ни один из них еще не очень зрелый. Вы обязательно должны сообщить об ошибке продавцу. (Я предполагаю, что это NVidia из-за ваших ссылок на CUDA) (После того, как вы убедитесь, что у вас установлена ​​последняя версия.)

0 голосов
/ 05 ноября 2010

Я даже не заглянул в спецификации GPU, чтобы выяснить, какие машины работают и не имеют жестких ограничений в 64 КБ постоянной памяти; Полагаю, вы убедились, что на самом деле это предел вашей карты.

Я добавлю замечание, что, как правило, графические процессоры и их CUDA / OpenCL / любые другие среды выполнения не очень агрессивны в отношении обнаружения или пометки ошибок, и, конечно, не предпринимают усилий для сбоя при использовании недопустимых параметров. Хотя я никогда не видел, чтобы это было прямо заявлено, я понимаю, что это отчасти для того, чтобы избежать накладных расходов, но главным образом для того, чтобы быть максимально прощающим; в игре лучше, чтобы рука монстров выглядела забавно в течение нескольких кадров, чем игра полностью умирала, потому что кто-то сделал единый доступ через границы.

Для тех, кто занимается программированием GPGPU, это неудобно - вам нужно убедиться, что все ваши параметры и использование памяти корректны, а если нет, результаты могут быть странными: иногда это будет работать, а часто и выигрывать «т. Но таков образ жизни. Я, конечно, не стал бы рассчитывать на то, что все выйдет из строя надежно и каким-то очевидным и полезным способом, если вы немного превысили заданный предел памяти.

...