во многих cublas или вызовы функций cusparse, они используют скалярные переменные, которые мы можем передать в любой указатель хоста или указатель устройства, такие как альфа и бета переменной здесь http://docs.nvidia.com/cuda/cublas/#cublas-lt-t-gt-gemmкаким образом cublas реализовать асинхронный скалярную переменную передачу
Как действительно ли это реализовано? Если данные находятся на хосте, я предполагаю, что ему потребуется выделить память на устройстве, а затем вызвать cudaMemcpyAsync для копирования данных. Однако выполнение cudaMalloc вызовет синхронный вызов функции. Как мы можем решить эту проблему?
Я вижу, вы имеете в виду, если это резидентный скаляр, тогда значение, которое будет использоваться ядром, берется в то время, когда ядро вызывается? Если это так, то мне не разрешено копировать асинхронную память с устройства на хост, а затем передать адрес целевого узла таким функциям, как cublas gemm? – shaoyl85
Ожидается, что параметр, переданный функции в C, будет действителен при вызове функции. То же самое верно для ядра. Если бы мы говорили только о вызовах ядра, ваша асинхронная memcopy, выпущенная * в том же потоке *, была бы в порядке, поскольку (даже aync) вызовы, выпущенные в один и тот же поток, сериализованы. Последующие вызовы ядра в этом потоке не будут выполняться до тех пор, пока не будут выполнены ранее выданные операции cudaMemcpyAsync. Но вызов функции cublas - это не то же самое, что голой вызов ядра. Рассматривайте его как функцию c. Во всяком случае, это все, кроме темы вашего первоначального вопроса. –
Спасибо. Просто для подтверждения, вы имеете в виду, если я делаю 'cudaMemcpyAsync (& h_alpha, & d_alpha, cudaMemcpyDeviceToHost),' follow by 'cublasSgemm (..., & h_alpha, ...);', это не сработает, потому что значение 'h_alpha 'принимается' cublasSgemm' немедленно, когда он вызывается, что может произойти до копирования в память? – shaoyl85