【发布时间】:2015-07-10 09:36:05
【问题描述】:
我已经安装了 Theano 库来提高计算速度,这样我就可以使用 GPU 的强大功能。
但是,在计算的内部循环中,会根据循环索引和几个数组的相应值计算新索引。
该计算出的索引随后用于访问另一个数组的元素,该元素又用于另一个计算。
这是否太复杂以至于无法期望 Theano 有任何显着的加速?
所以让我重新表述我的问题,反过来。 这是 GPU 代码 sn-p 的示例。为简洁起见,省略了一些初始化。我可以在不显着增加计算时间的情况下将其转换为 Python/Theano 吗?
__global__ void SomeKernel(const cuComplex* __restrict__ data,
float* __restrict__ voxels)
{
unsigned int idx = blockIdx.x * blockDim.x + threadIdx.x;
unsigned int idy = blockIdx.y * blockDim.y + threadIdx.y;
unsigned int pos = (idy * NX + idx);
unsigned int ind1 = pos * 3;
float x = voxels[ind1];
float y = voxels[ind1 + 1];
float z = voxels[ind1 + 2];
int m;
for (m = 0; m < M; ++m)
{
unsigned int ind2 = 3 * m;
float diff_x = x - some_pos[ind2];
float diff_y = y - some_pos[ind2 + 1];
float diff_z = z - some_pos[ind2 + 2];
float distance = sqrtf(diff_x * diff_x
+ diff_y * diff_y
+ diff_z * diff_z);
unsigned int dist = rintf(distance/some_factor);
ind3 = m * another_factor + dist;
cuComplex some_element = data[ind3];
Main calculation starts, involving some_element.
【问题讨论】:
-
请更具体一些,最好提供一些简单的代码示例。在“内部循环”中“计算”一个“新索引”留下了很大的想象空间,因此您的直接问题至少有两个答案('这是否太复杂......?'):是的。没有。
-
如果没有(理想情况下可复制+可粘贴的)代码示例来说明您正在尝试做什么,就无法知道您真正想要做什么。查看
theano.scan的文档。 -
some_pos从未初始化,所以我看不出这段代码如何运行,即使放在上下文中。什么是some_element??不如你在 Theano 中写一些东西,然后问问有没有更好的方法?看起来您正在计算位置网格到某个点的距离。这在 Theano 中只需要很少的几行代码。 -
所以你有一个en.wikipedia.org/wiki/Sequential_algorithm 通常 GPU 不是为此目的而构建的。如果您可以将其并行化(例如,通过该空间运行 1024 条独立跟踪),那么 GPU 将是值得的。