Первое, на что следует обратить внимание: что вы измеряете и самое важное как ?
Из твоего вопроса невозможно особо понять, как.
Во всяком случае, я настоятельно рекомендую вам взглянуть на это, это очень простая и полезная статья Марка Харриса, в которой объясняются некоторые полезные практики для выборки времени выполнения кода на стороне устройства (например, передачи памяти CUDA). , ядра и т. д.).
Кстати, попытка получить ускорение CPU / GPU - довольно сложная тема, это связано с действительно разной природой двух архитектур.
Даже если ваши коды CPU и GPU, по-видимому, делают одно и то же, существует множество
факторы, которые, возможно, вы хотите принять во внимание (например, ядра процессора, потоковые мультипроцессоры GPU и ядра на SM).
Здесь Роберт Кровелла дает отличный ответ на подобную проблему, как он говорит:
Если вы делаете какие-либо заявления о том, что «графический процессор быстрее, чем центральный процессор к XX», то, IMO, вам рекомендуется сравнивать только те коды, которые выполняют ту же работу, и эффективно и результативно использовать базовые архитектуры (как для ЦП, так и для ЦП). GPU). Например, в случае с процессором вы, безусловно, должны использовать многопоточный код, чтобы использовать преимущества нескольких ядер CPU, которые предлагает большинство современных процессоров. Подобные претензии, скорее всего, будут восприняты со скептицизмом, так что, вероятно, лучше избегать их, если это не суть вашего намерения.
Я предлагаю вам взглянуть на это обсуждение тоже.
После некоторых посылок я не думаю, что вы можете считать эти ускорения надежными (на самом деле они кажутся мне немного странными).
Пытаясь истолковать то, что вы пытались сказать:
Видно, что оба размера изображения с ядром 3 × 3 медленнее
Может быть, вы хотели сказать, что в 3х3 вы получили меньшее ускорение w.r.t. те для размера окна 5x5. Постарайтесь быть более точным.
Почему случай 2 имеет самое высокое ускорение, а случай 3 имеет самое низкое ускорение?
Ну, на самом деле трудно что-то сделать на основании предоставленной вами недостоверной информации.
Пожалуйста, добавьте: некоторый код, чтобы увидеть, что вы делаете и как вы решаете проблему в случае устройства и хоста, опишите, как и что вы измеряете.
РЕДАКТИРОВАТЬ:
Ну, я думаю, вы должны принять меры более точно.
- Сначала я бы порекомендовал вам использовать более точную альтернативу
clock()
. Посмотрите ответы здесь и ссылку на C ++, я предлагаю вам рассмотреть вопрос об использовании
std::chrono::system_clock::now()
std::chrono::high_resolution_clock::now();
- Тогда я повторю вас, чтобы прочитать статью (ссылка выше) Марка Харриса.
Здесь он говорит
Проблема с использованием точек синхронизации хост-устройства, таких как cudaDeviceSynchronize()
, заключается в том, что они блокируют конвейер графического процессора. По этой причине CUDA предлагает относительно легкую альтернативу таймерам ЦП через API событий CUDA. API событий CUDA включает вызовы для создания и уничтожения событий, записи событий и вычисления истекшего времени в миллисекундах между двумя записанными событиями.
Это означает, что фактические результаты по предоставленным мерам могут быть немного "искажены" при использовании cudaDeviceSynchronize()
.
Кроме того, нет необходимости использовать механизм синхронизации, если вы используете простой cudaMemcpy
, поскольку это синхронный вызов.
- Также подумайте о включении передач H2D / D2H, по моему мнению, важно учитывать эти издержки при сравнении CPU / GPU (но этот выбор остается за вами);
- О мерах, которые вы дали на картинке, являются ли они прямым результатом
или среднее число повторных различных казней (возможно, отбрасывая
значения расходов)?
Я думаю, вам следует попробовать новые меры, следуя приведенным выше предложениям, и рассмотреть полученные новые меры.
Кстати, вы сказали
Случай 1 имеет больший параллелизм, чем случай 3, из-за большего размера изображения.Поэтому использование устройства для случая 1 выше, чем для случая 3.
Я не согласен с этим, так как вы int grid_size = width/block_size;
Случай 1: grid_size = 640/32 = 20
CASE 2: grid_size = 1280/32 = 40
Так что у вас больше параллелизма вСлучай 2. Но так как у вас всего 2 SM, это может быть причиной того, что время может быть выше, чем вы ожидали.Другими словами, у вас есть больше блоков (40 * 40), ожидающих вычисления двух SM.