Данные в 3D-матрице генерировались слоями (сверху вниз), и я хочу умножить эти данные на двумерную матрицу B, но istead для взятия каждого слоя Мне нужно принять вектор из слоя 1, вектор из слоя 2 и т. д.Умножающая трехмерная матрица и 2D-матрица CUDA
В настоящее время, что я делаю это, чтобы скопировать эти векторы из 3D-матрицы на матрицу 2D TMPA затем умножить B (используя CUBLAS) и сохранение результатов в TMPB, наконец, скопировать обратно по строкам где это соответствует в 3D-матрице C.
В целом, мое приложение работает как минимум в два раза быстрее, чем версия процессора, но мне кажется, что эти копии памяти (даже), сделанные с устройства на устройство, не очень хороши для производительности.
Что было бы лучшим способом сделать это вычисление? Я думал о перестановке данных перед их умножением, чтобы избежать копий памяти.
3D-матрица и С и 2D матрицы В уже находятся в памяти графического процессора.
РЕДАКТИРОВАТЬ
Пусть М, Н, Р размеры матрицы 3D хранится в строке основного порядка в линейном массиве на память устройства. Мой код выглядит так:
cudaMalloc((void**)&d_tmpIn, sizeof(float)*M*P);
cudaMalloc((void**)&d_tmpOut, sizeof(float)*M*P);
cudaMalloc((void**)&d_C, sizeof(float)*M*N*P);
for (int iN = 0; iN < N; iN++)
{
dst = d_tmpIn;
for (int iM = 0; iM < M; iM++)
{
cudaMemcpy(dst, &(d_A[iN*P+0+iM*N*P]), sizeof(float)*P, cudaMemcpyD2D);
dst += P;
}
cublasDgemm(cublasHandle, CUBLAS_OP_N, CUBLAS_OP_N, P, M, M, &alpha, d_tmpIn, P, d_B, M, &beta, d_tmpOut, P);
src = d_tmpOut;
for (int iM = 0; iM < M; iM++)
{
cudaMemcpy(&(d_C[iN*P+0+iM*N*P]), src, sizeof(float)*P, cudaMemcpyD2D);
src += P;
}
}
Надеюсь, что это поможет.
Можете ли вы описать, как данные хранятся в памяти графического процессора и какие вызовы CUBLAS вы используете для этого расчета? Не совсем ясно, что вы на самом деле пытаетесь сделать из текста (подсказка: уравнения и короткие фрагменты кода стоят тысячи слов) – talonmies
Обычно cudaMemcpyD2D должен быть довольно быстрым. Вы профилировали приложение, чтобы определить, где тратится время? –
@RobertCrovella действительно они быстры, но мне было интересно, есть ли лучший способ сделать это, чтобы избежать этих копий памяти. Я посмотрю на предоставленный ответ и посмотрю, поможет ли это. – BRabbit27