void CuDnnRNNExecutor<ElemType>::ForwardCore( const GPUMatrix<ElemType>& weightsW, const GPUMatrix<ElemType>& inputX, GPUMatrix<ElemType>& outputY, const vector<size_t>& numSequencesForFrame, const RnnAttributes& rnnAttributes, GPUMatrix<ElemType>& reserve, GPUMatrix<ElemType>& workspace ) { // test that the RNN shape is correct if (!m_rnnT->IsCompatible(rnnAttributes)) LogicError("RNN Layout has changed during processing"); if (m_yDim != (m_rnnT->isBidirectional() ? 2 : 1) * m_rnnT->GetNumHidden()) InvalidArgument("CuDnn ForwardCore: Output leading dimension must be twice hidden size for bidirectional networks"); // set up the input and output descriptors SetDescriptors(m_xDim, numSequencesForFrame, xDesc); SetDescriptors(m_yDim, numSequencesForFrame, yDesc); // ensure workspace and reserve are large enough m_seqLength = numSequencesForFrame.size(); size_t workSize; size_t reserveSize; // Need for every pass CUDNN_CALL(cudnnGetRNNWorkspaceSize(*m_cudnn, *m_rnnT, (int)m_seqLength, xDesc.data(), &workSize)); // Only needed in training, can't be touched between passes. CUDNN_CALL(cudnnGetRNNTrainingReserveSize(*m_cudnn, *m_rnnT, (int)m_seqLength, xDesc.data(), &reserveSize)); // convert from bytes to ElemType workSize = (workSize + sizeof(ElemType) - 1) / (sizeof(ElemType)); reserveSize = (reserveSize + sizeof(ElemType) - 1) / sizeof(ElemType); reserve.Resize(reserveSize, 1); workspace.Resize(workSize, 1); wDesc = make_unique<CuDnnFilter<ElemType>>(*m_rnnT, xDesc[0]); if (wDesc->GetSize() != weightsW.GetNumElements()) InvalidArgument("RNN needs %ld parameters, but %ld were allocated", wDesc->GetSize(), weightsW.GetNumElements()); CUDNN_CALL(cudnnRNNForwardTraining( *m_cudnn, *m_rnnT, (int)m_seqLength, xDesc.data(), inputX.Data(), 0, 0, 0, 0, *wDesc, weightsW.Data(), yDesc.data(), outputY.Data(), 0, 0, 0, 0, workspace.Data(), workspace.GetNumElements()*sizeof(ElemType), reserve.Data(), reserve.GetNumElements()*sizeof(ElemType))); m_BackwardDataCalledYet = false; }
void Query::load(int version, const char* agentType, const properties_t& properties) { super::load(version, agentType, properties); if (properties.size() > 0) { for (propertie_const_iterator_t it = properties.begin(); it != properties.end(); ++it) { const property_t& p = (*it); if (strcmp(p.name, "Domain") == 0) { m_domain = p.value; } else if (strcmp(p.name, "Descriptors") == 0) { SetDescriptors(p.value); } else { //BEHAVIAC_ASSERT(0, "unrecognised property %s", p.name); } } } }