В каждой итерации цикла я вычисляю матрицу MATLAB.Все эти матрицы должны быть объединены вместе, чтобы создать одну окончательную матрицу.Я знаю размеры этой окончательной матрицы перед входом в цикл, так что я, хотя предварительное выделение матрицы с использованием функции 'нулей', будет быстрее, чем инициализация пустого массива, а затем просто добавление подмассивов в каждой итерации моего цикла.Как ни странно, моя программа работает НАМНОГО медленнее, когда я предварительно выделяю.Вот код (отличаются только первая и последняя строки):
Это медленно:
w_cuda = zeros(w_rows, w_cols, f_cols);
for j=0:num_groups-1
% gets # of rows & cols in W. The last group is a special
% case because it may have fewer than max_row_size rows
if (j == num_groups-1 && mod(w_rows, max_row_size) ~= 0)
num_rows_sub = w_rows - (max_row_size * j);
else
num_rows_sub = max_row_size;
end;
% calculate correct W and f matrices
start_index = (max_row_size * j) + 1;
end_index = start_index + num_rows_sub - 1;
w_sub = W(start_index:end_index,:);
f_sub = filterBank(start_index:end_index,:);
% Obtain sub-matrix
w_cuda_sub = nopack_cu(w_sub,f_sub);
% Incorporate sub-matrix into final matrix
w_cuda(start_index:end_index,:,:) = w_cuda_sub;
end
Это быстро:
w_cuda = [];
for j=0:num_groups-1
% gets # of rows & cols in W. The last group is a special
% case because it may have fewer than max_row_size rows
if (j == num_groups-1 && mod(w_rows, max_row_size) ~= 0)
num_rows_sub = w_rows - (max_row_size * j);
else
num_rows_sub = max_row_size;
end;
% calculate correct W and f matrices
start_index = (max_row_size * j) + 1;
end_index = start_index + num_rows_sub - 1;
w_sub = W(start_index:end_index,:);
f_sub = filterBank(start_index:end_index,:);
% Obtain sub-matrix
w_cuda_sub = nopack_cu(w_sub,f_sub);
% Incorporate sub-matrix into final matrix
w_cuda = [w_cuda; w_cuda_sub];
end
Что касается другихпотенциально полезная информация - моя матрица трехмерна, а числа внутри нее сложны.Как всегда, любые знания приветствуются.