2013-09-25 4 views
0

Я вижу, что CUBLAS может быть эффективным пакетом алгоритмов для одного большого умножения или добавления матриц и т. Д. Но в общей настройке большинство вычислений зависят. Итак, следующий шаг зависит от результата предыдущего шага.cublas: та же матрица ввода и вывода для лучшей производительности?

Это вызывает одну проблему, поскольку выходная матрица должна отличаться от входной матрицы в процедуре CUBLAS (поскольку входные матрицы являются константами), много времени тратится на пространство malloc и копирует данные с устройства на устройство для этих временных матриц.

Так можно делать такие вещи, как multiply (A, A, B), где первый аргумент - это выходная матрица, а вторая/третья - входные матрицы, чтобы избежать дополнительного времени манипуляции с памятью? Или есть лучшее обходное решение?

Большое спасибо!

ответ

4

Нет, невозможно выполнить операции на месте, такие как gemm, используя CUBLAS (на самом деле, я не знаю о параллельной реализации BLAS, которая гарантирует, что такая операция будет работать).

Сказав, что этот комментарий:

.... много времени потратить на это таНос пространство и копирование данных с устройства на устройство для этих временных матриц.

заставляет меня думать, что вы можете игнорировать очевидное. В то время как необходимо выделить пространство для промежуточных матриц, при использовании таких распределений, конечно, не обязательно выполнять копирование памяти устройства на устройство. Это:

// If A, B & C are pointers to allocations in device memory 
// compute C = A*B and copy result to A 
multiply(C, A, B); 
cudaMemcpy(A, C, sizeA, cudaMemcpyDeviceToDevice); 
// now A = A*B 

можно заменить

multiply(C, A, B); 
float * tmp = A; A = C; C = tmp; 

то есть. вам нужно всего лишь обменять указатели на хост, чтобы выполнить эквивалент устройства для копирования памяти устройства, но без затрат времени GPU. Это невозможно использовать в любой ситуации (например, есть некоторые операции на месте, которые могут по-прежнему требовать явной передачи памяти), но в большинстве случаев можно избежать явного устройства для переноса памяти устройства.

Если стоимость памяти больших плотных операций с CUBLAS ограничивает ваше приложение, рассмотрите вопрос об использовании "out of core" approaches для работы с большими плотными матрицами.

1

Вы можете предварительно выделить буферную матрицу и скопировать входную матрицу A в буфер до операции mat-mul.

Memcopy(buff, A); 
Multiply(A, buffer, B); 

Повторное использование буфера, вам не нужно выделить буферу каждый раз, а над головой будет только один мем копию для каждого мат-MUL. Когда ваша матрица достаточно велика, временная стоимость накладных расходов займет очень небольшую часть и может быть проигнорирована.