Пример #1
0
        /// <summary>
        /// Do BB step, updates alpha and "w" vector
        /// </summary>
        /// <remarks>
        /// This method has many side effects:
        /// 1. copies data on device from alphaPtr to alphaTmpPtr
        /// 2. sets values in deltas array, which are differences between new alpha and old alphas
        /// 3. alphaTmpPtr stores new updated alphas
        /// </remarks>
        /// <param name="step"></param>
        /// <param name="sub_prob"></param>
        private void DoBBstep(float step, Problem <SparseVec> sub_prob)
        {
            int blocks = (sub_prob.Elements.Length + threadsPerBlock - 1) / threadsPerBlock;

            /*
             * Update alpha
             *
             * 1. copy alpha to alphaTmp
             * 2. copy step into device constant
             * 3. set parameters
             *
             */
            cuda.CopyDeviceToDevice(alphaPtr, alphaTmpPtr, alphaMemSize);

            float[] stepData = new float[] { step };
            cuda.CopyHostToDevice(stepBBPtr, stepData);
            cuda.SetParameter(cuFuncUpdateAlpha, gradParamOffsetInUpdateAlpha, gradPtr.Pointer);
            cuda.SetParameter(cuFuncUpdateAlpha, alphaParamOffsetInUpdateAlpha, alphaTmpPtr.Pointer);
            cuda.Launch(cuFuncUpdateAlpha, blocks, 1);

            //float[] updatedAlpha = new float[sub_prob.ElementsCount];
            //cuda.CopyDeviceToHost(alphaTmpPtr, updatedAlpha);

            //float[] updatedDeltas = new float[sub_prob.ElementsCount];
            //cuda.CopyDeviceToHost(deltasPtr, updatedDeltas);

            /*
             * Update w - based on aplha deltas
             *
             */
            int bpgUpdateW = (sub_prob.Elements[0].Dim + threadsPerBlock - 1) / threadsPerBlock;

            cuda.CopyDeviceToDevice(wVecPtr, wTempVecPtr, wVecMemSize);
            cuda.SetParameter(cuFuncUpdateW, wVecParamOffsetInUpdateW, wTempVecPtr.Pointer);

            cuda.Launch(cuFuncUpdateW, bpgUpdateW, 1);

            //float[] wTest = new float[sub_prob.FeaturesCount];
            //cuda.CopyDeviceToHost(wTempVecPtr, wTest);
        }