static void kstat_calibrate() { uint i; static bool kstats_calibrated = false; if (kstats_calibrated) return; kstats_calibrated = true; /* slight innocent race */ /* FIXME: once we calculate the overhead of calibrate_empty we can * subtract that from every self_time measurement. * FIXME: The cost of * overhead_nested-overhead_empty should be subtracted from each * subpath_time. */ for (i=0; i<10000; i++) { KSTART(overhead_nested); KSTART(overhead_empty); KSTOP_NOT_PROPAGATED(overhead_empty); KSTOP(overhead_nested); } }
BEGIN_KERNEL_BODY() { KSTART(); // Define local memory float buff[2][TotalData]; float *src = buff[0], *dst = buff[1]; // Reserve input and output data RESERVE_POP(0, TotalData); RESERVE_PUSH_TICKET_INQ(0, 0, TotalData); // Load data from input queue COPY_TO_MEM(0, float, 0, TotalData, src); // Combine // FFT simple ordering for each fused level for (int i = 0; i < FusionLevel; ++i) { // combine for each fused level int n = Ns[i]; int totalData = 2 * n; DFTParams* DP = ROBX(2, DFTParams, i); float* w = ROBXY(3, float, 0, i); for (int j = 0; j < TotalData; j += totalData) CombineDFT(n, DP, w, &src[j], &dst[j]); // swap source and destination buffer float *tmp; tmp = src; src = dst; dst = tmp; } // Store data to output queue COPY_FROM_MEM(0, float, 0, TotalData, src); // Commit input and output data COMMIT_PUSH(0); COMMIT_POP(0); KEND(); } END_KERNEL_BODY();