2016-06-22 7 views
1

Это один из стандартных примеров кода мы находим, где каждый ...Почему мой GPU часть кода работает гораздо медленнее процессора

import time 
import numpy 

import pycuda.gpuarray as gpuarray 
import pycuda.cumath as cumath 
import pycuda.autoinit 

size = 1e7 

t0 = time.time() 
x = numpy.linspace(1, size, size).astype(numpy.float32) 
y = numpy.sin(x) 
t1 = time.time() 

cpuTime = t1-t0 
print(cpuTime) 

t0 = time.time() 
x_gpu = gpuarray.to_gpu(x) 
y_gpu = cumath.sin(x_gpu) 
y = y_gpu.get() 
t1 = time.time() 

gpuTime = t1-t0 
print(gpuTime) 

результаты: 200 мс для центрального процессора и 2,45 сек для GPU. .. более 10X

Я бегу на победу 10 ... против 2015 с PTVS ...

с наилучшими пожеланиями ...

Стеф

+0

Для начала вы должны, вероятно, использовать 'timeit' для точного времени выполнения среднего времени выполнения кода. Во-вторых, возможно, что в вызове 'gpuarray.to_gpu (x)' слишком много накладных расходов. Попробуйте выполнить эту настройку вне вашей функции синхронизации. Наконец, имейте в виду, что numpy очень оптимизирован для этих видов операций. Поэтому неразумно видеть в некоторых случаях более низкую производительность на графическом процессоре без оптимизации кода GPU. –

+0

Я выполнил вышеуказанный код с помощью модуля 'timeit'. Я получаю 20.6ms за цикл (100 циклов) для кода gpu и 129ms за цикл для numpy cpu code. GPU = GTX760, CPU = i5-2400. Интересно, что, по-видимому, код gpu работает медленнее при первом запуске в интерактивной подсказке python (400 мс), но быстрее (20 мс) с повторным исполнением в том же экземпляре. –

+0

Спасибо ... да я вижу то же самое ... довольно накладные расходы ... для первого прохода ... –

ответ

2

Похоже, что pycuda вводит некоторые дополнительные накладные расходы при первом вызове функции cumath.sin() (~ 400 мс в моей системе). Я подозреваю, что это связано с необходимостью компилировать код CUDA для вызываемой функции. Что еще более важно, эти служебные данные не зависят от размера массива, передаваемого функции. Дополнительные вызовы на cumath.sin() намного быстрее, причем код CUDA уже скомпилирован для использования. В моей системе код gpu, заданный в вопросе, длится около 20 мс (для повторных прогонов), по сравнению с примерно 130 мс для кода numpy.

Я не исповедую о многом о внутренней работе pycuda, поэтому было бы интересно услышать мнения других людей по этому вопросу.

+0

Спасибо за ваш ответ ... Да, похоже, у него довольно накладные расходы ... –

 Смежные вопросы

  • Нет связанных вопросов^_^