我认为,除非您能够以某种方式手动告诉Theano以并行化的方式执行此操作,否则无法进一步在GPU上增加此操作。在GPU上,那些不能并行执行的计算会与CPU相比以相同或较慢的速度执行。
引用来自
Daniel Renshaw的话:
“Theano希望您更多地关注您想要计算的内容而不是您想要如何计算。Idea是Theano优化编译器将自动并行化尽可能多的内容(使用OpenMP在GPU或CPU上)。”
还有另外一句引用:
“您需要能够按照Theano操作来指定您的计算。如果这些操作可以在GPU上并行处理,它们应该被自动并行化。”
来自Theano网页的引用:
“对于索引、维度重组和常量时间重塑,GPU和CPU的速度将是相同的。”
“对于张量的行/列求和,在GPU上可能比在CPU上慢一点。”
我认为您唯一能做的就是在您的.theanorc文件中将openmp标志设置为True。
无论如何,我试过一个想法。现在它不起作用,但希望有人能帮助我们使它工作。如果可以,您可能能够在GPU上并行化操作。下面的代码尝试在GPU上使用CUDA API完成所有操作。但是,有两个瓶颈不允许操作发生:1)
目前(截至2016年1月4日)Theano和CUDA不支持任何数据类型而不是
float32,2)
T.extra_ops.bincount()
仅适用于
int
数据类型。因此,这可能是Theano无法完全并行化操作的瓶颈。
import theano.tensor as T
from theano import shared, Out, function
import numpy as np
import theano.sandbox.cuda.basic_ops as sbasic
shared_var = shared(np.random.randint(0, 1000, 1000000).astype(T.config.floatX), borrow = True)
x = T.vector('x');
computeFunc = T.extra_ops.bincount(sbasic.as_cuda_ndarray_variable(T.cast(x, 'int16')))
func = function([], Out(sbasic.gpu_from_host(computeFunc), borrow = True), givens = {x: shared_var})
参考资料
1- 如何在Theano中并行设置多个元素
2- GPU可以加速哪些内容
3- 多核处理器在Theano中的应用