2016-01-04 2 views
3

Я только начинаю с Theano и Deep Learning. Я экспериментировал с примером из учебника Theano (http://deeplearning.net/software/theano/tutorial/using_gpu.html#returning-a-handle-to-device-allocated-data). Пример кода показан здесь:Понимание Theano Пример с точки зрения ядер GPU/нитей

from theano import function, config, shared, sandbox 
import theano.tensor as T 
import numpy 
import time 

vlen = 10 * 30 * 768 # 10 x #cores x # threads per core 
iters = 1000 

rng = numpy.random.RandomState(22) 
x = shared(numpy.asarray(rng.rand(vlen), config.floatX)) 
f = function([], T.exp(x)) 
print(f.maker.fgraph.toposort()) 
t0 = time.time() 
for i in xrange(iters): 
    r = f() 
t1 = time.time() 
print("Looping %d times took %f seconds" % (iters, t1 - t0)) 
print("Result is %s" % (r,)) 
if numpy.any([isinstance(x.op, T.Elemwise) for x in f.maker.fgraph.toposort()]): 
    print('Used the cpu') 
else: 
    print('Used the gpu') 

Я пытаюсь понять выражение, определяющее «vlen»,

vlen = 10 * 30 * 768 # 10 x #cores x # threads per core 

Я нигде не могу найти в тексте, который относится к числу ядер GPU указанный в этом примере, и почему было выбрано 30. Я также не могу понять, почему было использовано значение 768 потоков. Мой GPU (GeForce 840M) имеет 384 ядра. Могу ли я предположить, что если я заменил 384 вместо значения 30, я буду использовать все 384 ядра? Также должно быть зафиксировано значение 768 потоков?

+0

Я уверен, что цель комментария состоит в том, чтобы предположить, что размер проблемы, который должен быть создан ('vlen'), должен/должен быть достаточно большим, чтобы быть« интересным »на графическом процессоре. Коды CUDA, включая основы theano, которые используют CUDA, обычно не указывают количество ядер или количество потоков на ядро ​​(я могу только предположить здесь, что «core» = «SM», что не является обычным определением, но единственное, что имеет смысл). В конце концов, 'vlen' здесь в конечном счете - это просто число, длина массива. Если вы запустите код как есть, он будет использовать все ваши ядра GPU. В любой из них нет волшебства (10,30,768). –

+0

Вот почему у меня возникло затруднение с определением «vlen». Кажется, нет никаких оснований выражать это, почему. Это на самом деле кажется вводящим в заблуждение. – crayguy

+0

Да, и это довольно сложно, так как это часть учебника. – crayguy

ответ

2

Я считаю, что логика заключается в следующем. Глядя на the referenced page, мы видим, что упоминается GTX 275 GPU. Таким образом, графический процессор, используемый для этого учебника, может быть очень старым графическим процессором CUDA от поколения cc1.x (больше не поддерживается CUDA 7.0 и 7.5). В комментарии разработчик, похоже, использует слово «core» для обозначения GPU SM (многопроцессор).

В этом семействе было несколько графических процессоров, которые имели 30 SM (cc1.x SM было совсем другим животным, чем cc 2+ SM), включая GTX 275 (240 CUDA cores = 30SMs * 8cores/SM в cc1.x). Таким образом, число 30 получается из числа SM в используемом в то время графическом процессоре.

Кроме того, если вы просмотрите old documentation для версий CUDA, поддерживающих такие графические процессоры, вы обнаружите, что графические процессоры cc1.0 и cc1.1 поддерживают максимум 768 потоков на мультипроцессор (SM). Поэтому я считаю, что это то, откуда приходит номер 768.

Наконец, хороший код CUDA будет переписывать GPU (общее количество потоков больше, чем то, что может мгновенно обрабатывать графический процессор). Поэтому я считаю, что коэффициент 10 - это просто «переподписка».

Для определенного числа нет магии - это просто длина массива (vlen). Длина этого массива после того, как он протекает через структуру anano, в конечном итоге определит количество потоков в запуске ядра CUDA. Этот код не является эталоном или другим показателем производительности. Заявленная цель - просто продемонстрировать, что используется графический процессор.

Поэтому я не стал бы слишком много читать в этом номере. Это был случайный выбор разработчиком, который следовал определенной логике, относящейся к GPU под рукой.

+0

Благодарим вас за подробное объяснение. – crayguy

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