Я установил библиотеку Theano для увеличения скорости вычислений, чтобы я мог использовать мощность графического процессора.
Однако во внутреннем цикле вычисления вычисляется новый индекс на основе индекса цикла и соответствующих значений пары массивов.
Затем вычисляемый индекс используется для доступа к элементу другого массива, который, в свою очередь, используется для другого вычисления.
Неужели это слишком сложно ожидать каких-либо значительных ускорений от Theano?
Так позвольте мне перефразировать мой вопрос, наоборот. Ниже приведен пример фрагмента кода графического процессора. Некоторые из них исключены из соображений краткости. Можно ли перевести это на 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.