了解Theano核心/线程方面的Theano示例

时间:2016-01-04 05:34:03

标签: python machine-learning gpgpu theano theano-cuda

我刚开始使用Theano和Deep Learning。我正在试验Theano教程(http://deeplearning.net/software/theano/tutorial/using_gpu.html#returning-a-handle-to-device-allocated-data)中的一个例子。示例代码如下所示:

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个核心。我可以假设,如果我用304代替384,我将使用所有384个核心吗?还应该保留768个线程的值吗?

1 个答案:

答案 0 :(得分:2)

我相信逻辑如下。看看the referenced page,我们看到有人提到GTX 275 GPU。因此,用于该教程的GPU可能是来自cc1.x一代的非常古老的CUDA GPU(不再受CUDA 7.0和7.5支持)。在评论中,开发人员似乎正在使用" core"引用GPU SM(多处理器)。

该家族中有许多GPU有30个SM(cc1.x SM是一个非常不同的动物,而不是cc 2+ SM),包括GTX 275(240个CUDA核心= 30SM * 8个核心/ cc1.x代中的SM)。因此,30号码来自当时正在使用的GPU中的SM数量。

此外,如果您查看old documentation支持此类GPU的CUDA版本,您会发现cc1.0和cc1.1 GPU每个多处理器(SM)最多支持768个线程。所以我相信这就是768号码的来源。

最后,一个好的CUDA代码将超额预订GPU(线程总数超过GPU可以即时处理的数量)。所以我认为10倍是为了确保超额认购"。

特定数字没有魔力 - 它只是数组的长度(vlen)。在流经theano框架之后,此数组的长度将最终确定CUDA内核启动中的线程数。此代码并非真正的基准或其他性能指标。它的目的只是为了证明GPU正在被使用。

所以我不会读太多这个数字。开发人员随意选择了与手头GPU相关的一定数量的逻辑。