Хорошо, если вы написали свой код CUDA правильно, да, это может быть намного быстрее. Думаю об этом. Вы переместили код из последовательного исполнения на одном процессоре на параллельное выполнение на сотнях процессоров, в зависимости от вашей модели графического процессора. Моя средняя карта за 179 долларов США имеет 480 ядер. Некоторые из доступных теперь имеют 1500 ядер. Очень возможно получить 100-кратные прыжки с CUDA, особенно если ваше ядро намного больше вычисляется, чем связано с памятью.
Тем не менее, убедитесь, что вы измеряете то, что, по вашему мнению, вы измеряете.Если вы вызываете свое ядро CUDA без использования каких-либо явных потоков, тогда вызов синхронен с хостом, и ваши тайминги должны быть точными. Если вы вызываете свое ядро с помощью потока, вам нужно вызвать cudaDeviceSynchronise() или оживить код хоста в событии, о котором сообщает ядро. Вызовы ядра, вызываемые в потоке, выполняются асинхронно с потоком хоста, поэтому измерения времени в потоке хоста не будут правильно отражать время ядра, если вы не сделаете поток хоста до тех пор, пока вызов ядра не будет завершен. Вы также можете использовать события CUDA для измерения прошедшего времени на графическом процессоре в пределах данного потока. См. Раздел 5.1.2 Руководства по лучшей практике CUDA в NVIDIA GPU Computing SDK 4.2.
Ускорение 100x не очень удивительно с CUDA. Но вы должны опубликовать код, чтобы мы могли видеть, что вы делаете! –
Вы использовали потоки? Вы добавили 'cudaDeviceSynchronize()' после вызова ядра и перед измерением времени в случае использования потока по умолчанию? – geek
Поскольку OP использует события, OP должен использовать cudaEventSynchronize(), а не cudaDeviceSynchronize() (последний будет работать, но это немного тяжелый молот для синхронизации ...). – harrism