В качестве следующего за предыдущим вопросом here, я пытаюсь реализовать следующий цикл, который является умножением матрицы-вектора, где вектор является столбцом из матрицы Q, основанной на на итератора петли:CUDA/CUBLAS: Доступ к элементам в массиве
EDIT: Q не может быть заполнен, прежде чем руки, но заполняется с прогрессированием итератора К.
for (unsigned K=0;K<N;K++){ // Number of iterations loop
//... do some stuff
for (unsigned i=0; i<N; i++){
float sum = 0;
for (unsigned j=0; j<N; j++){
sum += A[j][i]*Q[j][K];
}
v[i] = sum;
}
//... do some stuff
// populate next column of Q
}
в случае, если размеры массивов:
а [Н х N]
Q [N х (0,5н + 1)]
Эти массивы были сплющенные, с тем, чтобы использовать их с cublasSgemv(). Мой вопрос в том, можно ли использовать cublasSgemv(), сообщая ему, с чего начать доступ к d_Q, и каков прирост элементов (так как он является основным строком C++):
EDIT: умноженное увеличение доступа к памяти с помощью SizeOf (с плавающей точкой). Насколько мне известно, все еще не работает.
Niter = 0.5*N + 1;
for (unsigned K=0;K<N;K++){
cublasSgemv(handle, CUBLAS_OP_T, N, N, &alpha, d_A, N, (d_Q + sizeof(float)*K*(Niter)), (Niter), &beta, d_v , 1);
}
Я не думаю, что его можно индексировать d_Q, как, что, как я не получаю никаких результатов
РЕШИТЬ: решение по @RobertCrovella является то, что я искал. Благодарю.
Вы выполняете скалярное произведение между всеми возможными парами '(a, q)', где 'a' - столбец' A' и 'q' - столбец' Q'. Не могли бы вы получить тот же результат с помощью стандартного матрично-матричного умножения между «A» и «Q» с помощью 'cublasSgemm'? – JackOLantern
Я действительно хочу использовать только один столбец из Q, поскольку матрица заполняется только этим столбцом и затем заполняется глобальным циклом (K). – rex
Почему вы не можете заполнить матрицу 'Q' перед циклами? В любом случае это не кажется ясным в вашем вопросе. Возможно, вы могли бы рассмотреть возможность его более уточнения относительно ограничений реализации? – JackOLantern