2016-08-19 8 views
1

Я разрабатываю программное обеспечение, которое должно работать на нескольких графических процессорах CUDA различного объема памяти и вычислить возможности. Случилось со мной несколько раз, что клиенты сообщают о воспроизводимой проблеме на своем графическом процессоре, которую я не мог воспроизвести на своей машине. Возможно, потому, что у меня 8 ГБ памяти GPU, и у них 4 ГБ, возможно, потому что вычислительная способность 3.0, а не 2.0, такие вещи.Снижение производительности графического процессора до модели с меньшими возможностями и памятью для тестирования

Таким образом, вопрос: могу ли я временно «понизить» свой графический процессор, чтобы он претендовал на меньшую модель, с меньшим объемом памяти и/или с меньшей вычислительной способностью?

По комментариям, поясняющим, о чем я прошу.

Предположим, что у клиента возникла проблема с запуском на графическом процессоре с вычислительной способностью C с M гигабайтами памяти графического процессора и T потоками на блок. У меня есть лучший графический процессор на моей машине, с более высокой вычислительной способностью, большим объемом памяти и большим количеством потоков на каждый блок.

1) Могу ли я запустить свою программу на своем графическом процессоре, ограниченную M гигабайтами памяти GPU? Ответ на этот вопрос кажется «да», просто выделите (независимо от того, что у вас есть) - M при запуске и никогда не используйте его, что оставит только M, пока ваша программа не выйдет ».

2) Можно ли уменьшить размер блоков на моем графическом процессоре до не более T потоков на время выполнения?

3) Могу ли я уменьшить вычислительную способность моего GPU на время выполнения, как видно из моей программы?

+1

Это дубликат некоторых предыдущих вопросов. –

+0

@RobertCrovella: какой? – Michael

+0

Конечно, я над этим работаю. Процесс поиска предыдущего обмана не является тривиальным. Вы можете искать его сами, если хотите. –

ответ

3

Я изначально хотел сделать этот комментарий, но он был слишком большой для этого объема.

Как @RobertCrovella отметил, что нет собственного способа делать то, о чем вы просите. Тем не менее, вы можете принять следующие меры, чтобы свести к минимуму ошибки, которые вы видите на других архитектурах.

0) Попробуйте получить результат от cudaGetDeviceProperties от графических процессоров CUDA, на которые вы хотите настроить таргетинг. Вы можете толковать источник этого от своих пользователей или сообщества.

1) Чтобы ограничить память, вы можете либо реализовать диспетчер памяти, либо вручную отслеживать используемую память, либо использовать cudaGetMemInfo, чтобы получить достаточно близкую оценку. Примечание. Эта функция возвращает память, используемую другими приложениями.

2) У вас есть макрос-оболочка для запуска ядра, где вы можете явно проверить, соответствует ли количество блоков/потоков текущему профилю. т.е. Вместо запуска

kernel<float><<<blocks, threads>>>(a, b, c); 

Вы бы сделать что-то вроде этого:

LAUNCH_KERNEL((kernel<float>), blocks, threads, a, b, c); 

Где вы можете иметь макрос быть определен следующим образом:

#define LAUNCH_KERNEL(kernel, blocks, threads, ...)\ 
     check_blocks(blocks);\ 
     check_threads(threads);\ 
     kernel<<<blocks, threads>>>(__VA_ARGS__) 

3) Уменьшение возможности вычислений невозможно, но вы можете, однако, скомпилировать свой код с различными режимами расчета и убедиться, что ваши ядра имеют обратно совместимый код в них.Если определенная часть ваших ошибок ядра с более старым режимом вычислений, вы можете сделать что-то вроде этого:

#if !defined(TEST_FALLBACK) && __CUDA_ARCH__ >= 300 // Or any other newer compute 
// Implement using new fancy feature 
#else 
// Implement a fallback version 
#endif 

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