void CloverChunk::enqueueKernel (cl::Kernel const& kernel, int line, const char* file, const cl::NDRange offset_range, const cl::NDRange global_range, const cl::NDRange local_range, const std::vector< cl::Event > * const events, cl::Event * const event) { try { if (profiler_on) { // time it cl::Event *prof_event; cl_ulong start, end; // used if no event was passed static cl::Event no_event_passed = cl::Event(); if (event != NULL) { prof_event = event; } else { prof_event = &no_event_passed; } std::string func_name; kernel.getInfo(CL_KERNEL_FUNCTION_NAME, &func_name); #if 0 fprintf(stdout, "Enqueueing kernel: %s\n", func_name.c_str()); fprintf(stdout, "%zu global dimensions\n", global_range.dimensions()); fprintf(stdout, "%zu local dimensions\n", local_range.dimensions()); fprintf(stdout, "%zu offset dimensions\n", offset_range.dimensions()); fprintf(stdout, "Global size: [%zu %zu]\n", global_range[0], global_range[1]); fprintf(stdout, "Local size: [%zu %zu]\n", local_range[0], local_range[1]); fprintf(stdout, "Offset size: [%zu %zu]\n", offset_range[0], offset_range[1]); fprintf(stdout, "\n"); #endif queue.enqueueNDRangeKernel(kernel, offset_range, global_range, local_range, events, prof_event); prof_event->wait(); prof_event->getProfilingInfo(CL_PROFILING_COMMAND_START, &start); prof_event->getProfilingInfo(CL_PROFILING_COMMAND_END, &end); double taken = static_cast<double>(end-start)*1.0e-6; kernel_calls.at(func_name) += 1; kernel_times.at(func_name) += taken; } else { // just launch kernel queue.enqueueNDRangeKernel(kernel, offset_range, global_range, local_range, events, event); } } catch (cl::Error e) { std::string func_name; kernel.getInfo(CL_KERNEL_FUNCTION_NAME, &func_name); // invalid work group size if (e.err() == -54) { std::stringstream errstr; errstr << "Error in enqueueing kernel " << func_name; errstr << " at line " << line << " in " << file << std::endl; errstr << errToString(e.err()).c_str() << std::endl; errstr << "Launched with "; errstr << global_range.dimensions() << " global dimensions, "; errstr << local_range.dimensions() << " local dimensions." << std::endl; for (unsigned int ii = 0; ii < global_range.dimensions(); ii++) { errstr << "Launch dimension " << ii << ": "; errstr << "global " << global_range[ii] << ", "; errstr << "local " << local_range[ii] << " "; // only print this if there is actually an offset if (offset_range.dimensions()) errstr << "(offset " << offset_range[ii] << ") - "; errstr << "(" << global_range[ii] << "%" << local_range[ii] << ") "; errstr << "= " << global_range[ii] % local_range[ii] << std::endl; } DIE(errstr.str().c_str()); } else { DIE("Error in enqueueing kernel '%s' at line %d in %s\n" "Error in %s, code %d (%s) - exiting\n", func_name.c_str(), line, file, e.what(), e.err(), errToString(e.err()).c_str()); } } }
void SoapyRPCSocket::reportError(const std::string &what, const int err) { if (err == 0) _lastErrorMsg = what; else this->reportError(what, std::to_string(err) + ": " + errToString(err)); }