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);
}
Пример #2
0
 /**
  * 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;        
 }
Пример #3
0
 /**
  *  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;
 }
Пример #4
0
 /**
  * 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;
 }