int main (int argc, const char * argv[]) { printf("4. OpenCL Profile No Overhead in the Loop\n"); float range = BIG_RANGE; float *in, *out; // ======== Initialize init_all_perfs(); create_data(&in, &out); start_perf_measurement(&total_perf); // ======== Setup OpenCL setup_cl(argc, argv, &opencl_device, &opencl_context, &opencl_queue); // ======== Setup the computation setup_cl_compute(); start_perf_measurement(&write_perf); copy_data_to_device(in, out); stop_perf_measurement(&write_perf); // ======== Compute while (range > LIMIT) { // Calculation start_perf_measurement(&update_perf); update_cl(get_in_buffer(), get_out_buffer()); stop_perf_measurement(&update_perf); // Read back the data start_perf_measurement(&read_perf); read_back_data(get_out_buffer(), out); stop_perf_measurement(&read_perf); // Compute Range start_perf_measurement(&range_perf); range = find_range(out, SIZE*SIZE); stop_perf_measurement(&range_perf); iterations++; printf("Iteration %d, range=%f.\n", iterations, range); } // ======== Finish and cleanup OpenCL start_perf_measurement(&finish_perf); clFinish(opencl_queue); stop_perf_measurement(&finish_perf); start_perf_measurement(&cleanup_perf); cleanup_cl(); stop_perf_measurement(&cleanup_perf); stop_perf_measurement(&total_perf); print_perfs(); free(in); free(out); }
/** * TODO * * \return values: * false: no task present * true : there is a new value, you should check if the task is an FF_EOS */ inline bool load_result_nb(void ** task) { FFBUFFER * outbuffer = get_out_buffer(); if (outbuffer) { if (outbuffer->pop(task)) return true; else return false; } if (!has_input_channel) error("PIPE: accelerator is not set, offload not available"); else error("PIPE: output buffer not created"); return false; }
/** * It loads results. If \p false, EOS arrived or too many retries. If \p * true, there is a new value */ inline bool load_result(void ** task, unsigned int retry=((unsigned int)-1), unsigned int ticks=ff_node::TICKS2WAIT) { FFBUFFER * outbuffer = get_out_buffer(); if (outbuffer) { for(unsigned int i=0;i<retry;++i) { if (outbuffer->pop(task)) { if ((*task != (void *)FF_EOS)) return true; else return false; } ticks_wait(ticks); } return false; } if (!has_input_channel) error("PIPE: accelerator is not set, offload not available"); else error("PIPE: output buffer not created"); return false; }
/** * It prepare the Pipeline skeleton for execution. * * \return TODO */ inline int prepare() { // create input FFBUFFER int nstages=static_cast<int>(nodes_list.size()); for(int i=1;i<nstages;++i) { if (nodes_list[i]->create_input_buffer(in_buffer_entries, fixedsize)<0) { error("PIPE, creating input buffer for node %d\n", i); return -1; } } // set output buffer for(int i=0;i<(nstages-1);++i) { if (nodes_list[i]->set_output_buffer(nodes_list[i+1]->get_in_buffer())<0) { error("PIPE, setting output buffer to node %d\n", i); return -1; } } // Preparation of buffers for the accelerator int ret = 0; if (has_input_channel) { if (create_input_buffer(in_buffer_entries, fixedsize)<0) { error("PIPE, creating input buffer for the accelerator\n"); ret=-1; } else { if (get_out_buffer()) { error("PIPE, output buffer already present for the accelerator\n"); ret=-1; } else { if (create_output_buffer(out_buffer_entries,fixedsize)<0) { error("PIPE, creating output buffer for the accelerator\n"); ret = -1; } } } } prepared=true; return ret; }