/// <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); }