public void device_mc_run1f(double[] payoff_a, CMCEvaluator evaluator) { if (mcplan._nscen_per_batch % 4096 != 0) throw new System.Exception(); CArray device_y_sk = new CArray(mcplan.nk * mcplan._nscen_per_batch, EType.short_t, EMemorySpace.device, this, "_device_volatile_buf"); for (int b = 0; b < mcplan._nbatches; b++) { unsafe { fixed (short* yhost_sk = &mcbuf.host_y_sk_th[0]) { int status = opcuda_mc1f(mcbuf._device_rgstatus.ptr, grid.y0, device_y_sk.ptr, mcplan._nscen_per_batch, mcplan.nk, grid.d, mcbuf._device_ctpk_yy_m.ptr, mcbuf._device_m_k.ptr, (uint)yhost_sk); if (status > 0) throw new System.Exception(); device_thread_synchronize(); evaluator.eval(yhost_sk, 0, b); } } } }
public void host_d_mc_run1f(double[] payoff_a, CMCEvaluator Evaluator) { OPModel.Types.CJobQueue Queue = new OPModel.Types.CJobQueue(); object[] p_b = new object[mcplan._nbatches]; for (int b = 0; b < mcplan._nbatches; b++) { host_d_mc_run1f_func_input input = new host_d_mc_run1f_func_input(); input.batch = b; input.Evaluator = Evaluator; p_b[b] = input; } Queue.Exec(host_d_mc_run1f_func, null, p_b, mcplan.nth); }