From e5bd4fcb19a07170016b49bdd15c2eee6cd902bd Mon Sep 17 00:00:00 2001 From: Tom Deakin Date: Thu, 16 Jul 2015 16:36:30 +0100 Subject: [PATCH] Be consistent with indenting --- ocl-stream.cpp | 552 ++++++++++++++++++++++++------------------------- 1 file changed, 276 insertions(+), 276 deletions(-) diff --git a/ocl-stream.cpp b/ocl-stream.cpp index bc8e4a6..e8be8a2 100644 --- a/ocl-stream.cpp +++ b/ocl-stream.cpp @@ -27,83 +27,83 @@ unsigned getDeviceList(std::vector& devices); struct badfile : public std::exception { - virtual const char * what () const throw () - { - return "Cannot open kernel file"; - } + virtual const char * what () const throw () + { + return "Cannot open kernel file"; + } }; struct badtype : public std::exception { - virtual const char * what () const throw () - { - return "Datatype is not 4 or 8"; - } + virtual const char * what () const throw () + { + return "Datatype is not 4 or 8"; + } }; struct invaliddevice : public std::exception { - virtual const char * what () const throw () - { - return "Chosen device index is invalid"; - } + virtual const char * what () const throw () + { + return "Chosen device index is invalid"; + } }; size_t sizes[4] = { - 2 * sizeof(DATATYPE) * ARRAY_SIZE, - 2 * sizeof(DATATYPE) * ARRAY_SIZE, - 3 * sizeof(DATATYPE) * ARRAY_SIZE, - 3 * sizeof(DATATYPE) * ARRAY_SIZE + 2 * sizeof(DATATYPE) * ARRAY_SIZE, + 2 * sizeof(DATATYPE) * ARRAY_SIZE, + 3 * sizeof(DATATYPE) * ARRAY_SIZE, + 3 * sizeof(DATATYPE) * ARRAY_SIZE }; void check_solution(std::vector& a, std::vector& b, std::vector& c) { - // Generate correct solution - DATATYPE golda = 1.0; - DATATYPE goldb = 2.0; - DATATYPE goldc = 0.0; + // Generate correct solution + DATATYPE golda = 1.0; + DATATYPE goldb = 2.0; + DATATYPE goldc = 0.0; - const DATATYPE scalar = 3.0; + const DATATYPE scalar = 3.0; - for (unsigned int i = 0; i < NTIMES; i++) - { - goldc = golda; - goldb = scalar * goldc; - goldc = golda + goldb; - golda = goldb + scalar * goldc; - } + for (unsigned int i = 0; i < NTIMES; i++) + { + goldc = golda; + goldb = scalar * goldc; + goldc = golda + goldb; + golda = goldb + scalar * goldc; + } - // Calculate average error - double erra = 0.0; - double errb = 0.0; - double errc = 0.0; - for (unsigned int i = 0; i < ARRAY_SIZE; i++) - { - erra += fabs(a[i] - golda); - errb += fabs(b[i] - goldb); - errc += fabs(c[i] - goldc); - } - erra /= (double)ARRAY_SIZE; - errb /= (double)ARRAY_SIZE; - errc /= (double)ARRAY_SIZE; + // Calculate average error + double erra = 0.0; + double errb = 0.0; + double errc = 0.0; + for (unsigned int i = 0; i < ARRAY_SIZE; i++) + { + erra += fabs(a[i] - golda); + errb += fabs(b[i] - goldb); + errc += fabs(c[i] - goldc); + } + erra /= (double)ARRAY_SIZE; + errb /= (double)ARRAY_SIZE; + errc /= (double)ARRAY_SIZE; - double epsi; - if (sizeof(DATATYPE) == 4) epsi = 1.0E-6; - else if (sizeof(DATATYPE) == 8) epsi = 1.0E-13; - else throw badtype(); + double epsi; + if (sizeof(DATATYPE) == 4) epsi = 1.0E-6; + else if (sizeof(DATATYPE) == 8) epsi = 1.0E-13; + else throw badtype(); - if (erra > epsi) - std::cout - << "Validation failed on a[]. Average error " << erra - << std::endl; - if (errb > epsi) - std::cout - << "Validation failed on b[]. Average error " << errb - << std::endl; - if (errc > epsi) - std::cout - << "Validation failed on c[]. Average error " << errc - << std::endl; + if (erra > epsi) + std::cout + << "Validation failed on a[]. Average error " << erra + << std::endl; + if (errb > epsi) + std::cout + << "Validation failed on b[]. Average error " << errb + << std::endl; + if (errc > epsi) + std::cout + << "Validation failed on c[]. Average error " << errc + << std::endl; } cl_uint deviceIndex = 0; @@ -111,195 +111,195 @@ cl_uint deviceIndex = 0; int main(int argc, char *argv[]) { - // Print out run information - std::cout - << "GPU-STREAM" << std::endl - << "Version: " << VERSION_STRING << std::endl - << "Implementation: OpenCL" << std::endl << std::endl; + // Print out run information + std::cout + << "GPU-STREAM" << std::endl + << "Version: " << VERSION_STRING << std::endl + << "Implementation: OpenCL" << std::endl << std::endl; - try - { - parseArguments(argc, argv); + try + { + parseArguments(argc, argv); - // Open the Kernel source - std::ifstream in("ocl-stream-kernels.cl"); - if (!in.is_open()) throw badfile(); - std::string kernels(std::istreambuf_iterator(in), (std::istreambuf_iterator())); + // Open the Kernel source + std::ifstream in("ocl-stream-kernels.cl"); + if (!in.is_open()) throw badfile(); + std::string kernels(std::istreambuf_iterator(in), (std::istreambuf_iterator())); - // Setup OpenCL + // Setup OpenCL - // Get list of devices - std::vector devices; - getDeviceList(devices); + // Get list of devices + std::vector devices; + getDeviceList(devices); - // Check device index is in range - if (deviceIndex >= devices.size()) throw invaliddevice(); + // Check device index is in range + if (deviceIndex >= devices.size()) throw invaliddevice(); - cl::Device device = devices[deviceIndex]; + cl::Device device = devices[deviceIndex]; - cl::Context context(device); - cl::CommandQueue queue(context); - cl::Program program(context, kernels); + cl::Context context(device); + cl::CommandQueue queue(context); + cl::Program program(context, kernels); - // Print out device name - std::string name = getDeviceName(device); - std::cout << "Using OpenCL device " << name << std::endl; + // Print out device name + std::string name = getDeviceName(device); + std::cout << "Using OpenCL device " << name << std::endl; - try - { - program.build(); - } - catch (cl::Error& e) - { - std::vector devices = context.getInfo(); - std::string buildlog = program.getBuildInfo(devices[0]); - std::cerr - << "Build error:" - << buildlog - << std::endl; - throw e; - } + try + { + program.build(); + } + catch (cl::Error& e) + { + std::vector devices = context.getInfo(); + std::string buildlog = program.getBuildInfo(devices[0]); + std::cerr + << "Build error:" + << buildlog + << std::endl; + throw e; + } - cl::make_kernel copy(program, "copy"); - cl::make_kernel mul(program, "mul"); - cl::make_kernel add(program, "add"); - cl::make_kernel triad(program, "triad"); + cl::make_kernel copy(program, "copy"); + cl::make_kernel mul(program, "mul"); + cl::make_kernel add(program, "add"); + cl::make_kernel triad(program, "triad"); - // Create host vectors - std::vector h_a(ARRAY_SIZE, 1.0); - std::vector h_b(ARRAY_SIZE, 2.0); - std::vector h_c(ARRAY_SIZE, 0.0); + // Create host vectors + std::vector h_a(ARRAY_SIZE, 1.0); + std::vector h_b(ARRAY_SIZE, 2.0); + std::vector h_c(ARRAY_SIZE, 0.0); - // Create device buffers - cl::Buffer d_a(context, CL_MEM_READ_WRITE, sizeof(DATATYPE) * ARRAY_SIZE); - cl::Buffer d_b(context, CL_MEM_READ_WRITE, sizeof(DATATYPE) * ARRAY_SIZE); - cl::Buffer d_c(context, CL_MEM_READ_WRITE, sizeof(DATATYPE) * ARRAY_SIZE); + // Create device buffers + cl::Buffer d_a(context, CL_MEM_READ_WRITE, sizeof(DATATYPE) * ARRAY_SIZE); + cl::Buffer d_b(context, CL_MEM_READ_WRITE, sizeof(DATATYPE) * ARRAY_SIZE); + cl::Buffer d_c(context, CL_MEM_READ_WRITE, sizeof(DATATYPE) * ARRAY_SIZE); - // Copy host memory to device - cl::copy(queue, h_a.begin(), h_a.end(), d_a); - cl::copy(queue, h_b.begin(), h_b.end(), d_b); - cl::copy(queue, h_c.begin(), h_c.end(), d_c); + // Copy host memory to device + cl::copy(queue, h_a.begin(), h_a.end(), d_a); + cl::copy(queue, h_b.begin(), h_b.end(), d_b); + cl::copy(queue, h_c.begin(), h_c.end(), d_c); - // Make sure the copies are finished - queue.finish(); + // Make sure the copies are finished + queue.finish(); - // List of times - std::vector< std::vector > timings; + // List of times + std::vector< std::vector > timings; - // Declare timers - std::chrono::high_resolution_clock::time_point t1, t2; + // Declare timers + std::chrono::high_resolution_clock::time_point t1, t2; - // Main loop - for (unsigned int k = 0; k < NTIMES; k++) - { - std::vector times; - t1 = std::chrono::high_resolution_clock::now(); - copy( - cl::EnqueueArgs( + // Main loop + for (unsigned int k = 0; k < NTIMES; k++) + { + std::vector times; + t1 = std::chrono::high_resolution_clock::now(); + copy( + cl::EnqueueArgs( queue, cl::NDRange(ARRAY_SIZE)), d_a, d_c); - queue.finish(); - t2 = std::chrono::high_resolution_clock::now(); - times.push_back(std::chrono::duration_cast >(t2 - t1).count()); + queue.finish(); + t2 = std::chrono::high_resolution_clock::now(); + times.push_back(std::chrono::duration_cast >(t2 - t1).count()); - t1 = std::chrono::high_resolution_clock::now(); - mul( - cl::EnqueueArgs( + t1 = std::chrono::high_resolution_clock::now(); + mul( + cl::EnqueueArgs( queue, cl::NDRange(ARRAY_SIZE)), d_b, d_c); - queue.finish(); - t2 = std::chrono::high_resolution_clock::now(); - times.push_back(std::chrono::duration_cast >(t2 - t1).count()); + queue.finish(); + t2 = std::chrono::high_resolution_clock::now(); + times.push_back(std::chrono::duration_cast >(t2 - t1).count()); - t1 = std::chrono::high_resolution_clock::now(); - add( - cl::EnqueueArgs( + t1 = std::chrono::high_resolution_clock::now(); + add( + cl::EnqueueArgs( queue, cl::NDRange(ARRAY_SIZE)), d_a, d_b, d_c); - queue.finish(); - t2 = std::chrono::high_resolution_clock::now(); - times.push_back(std::chrono::duration_cast >(t2 - t1).count()); + queue.finish(); + t2 = std::chrono::high_resolution_clock::now(); + times.push_back(std::chrono::duration_cast >(t2 - t1).count()); - t1 = std::chrono::high_resolution_clock::now(); - triad( - cl::EnqueueArgs( + t1 = std::chrono::high_resolution_clock::now(); + triad( + cl::EnqueueArgs( queue, cl::NDRange(ARRAY_SIZE)), d_a, d_b, d_c); - queue.finish(); - t2 = std::chrono::high_resolution_clock::now(); - times.push_back(std::chrono::duration_cast >(t2 - t1).count()); + queue.finish(); + t2 = std::chrono::high_resolution_clock::now(); + times.push_back(std::chrono::duration_cast >(t2 - t1).count()); - timings.push_back(times); + timings.push_back(times); - } + } - // Check solutions - cl::copy(queue, d_a, h_a.begin(), h_a.end()); - cl::copy(queue, d_b, h_b.begin(), h_b.end()); - cl::copy(queue, d_c, h_c.begin(), h_c.end()); - check_solution(h_a, h_b, h_c); + // Check solutions + cl::copy(queue, d_a, h_a.begin(), h_a.end()); + cl::copy(queue, d_b, h_b.begin(), h_b.end()); + cl::copy(queue, d_c, h_c.begin(), h_c.end()); + check_solution(h_a, h_b, h_c); - // Crunch results - double min[4] = {DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX}; - double max[4] = {0.0, 0.0, 0.0, 0.0}; - double avg[4] = {0.0, 0.0, 0.0, 0.0}; - // Ignore first result - for (unsigned int i = 1; i < NTIMES; i++) - { - for (int j = 0; j < 4; j++) - { - avg[j] += timings[i][j]; - min[j] = MIN(min[j], timings[i][j]); - max[j] = MAX(max[j], timings[i][j]); - } - } - for (int j = 0; j < 4; j++) - avg[j] /= (double)(NTIMES-1); + // Crunch results + double min[4] = {DBL_MAX, DBL_MAX, DBL_MAX, DBL_MAX}; + double max[4] = {0.0, 0.0, 0.0, 0.0}; + double avg[4] = {0.0, 0.0, 0.0, 0.0}; + // Ignore first result + for (unsigned int i = 1; i < NTIMES; i++) + { + for (int j = 0; j < 4; j++) + { + avg[j] += timings[i][j]; + min[j] = MIN(min[j], timings[i][j]); + max[j] = MAX(max[j], timings[i][j]); + } + } + for (int j = 0; j < 4; j++) + avg[j] /= (double)(NTIMES-1); - // Display results - std::string labels[] = {"Copy", "Mul", "Add", "Triad"}; - std::cout - << std::left << std::setw(12) << "Function" - << std::left << std::setw(12) << "MBytes/sec" - << std::left << std::setw(12) << "Min (sec)" - << std::left << std::setw(12) << "Max" - << std::left << std::setw(12) << "Average" - << std::endl; - for (int j = 0; j < 4; j++) - { - std::cout - << std::left << std::setw(12) << labels[j] - << std::left << std::setw(12) << 1.0E-06 * sizes[j]/min[j] - << std::left << std::setw(12) << min[j] - << std::left << std::setw(12) << max[j] - << std::left << std::setw(12) << avg[j] - << std::endl; - } + // Display results + std::string labels[] = {"Copy", "Mul", "Add", "Triad"}; + std::cout + << std::left << std::setw(12) << "Function" + << std::left << std::setw(12) << "MBytes/sec" + << std::left << std::setw(12) << "Min (sec)" + << std::left << std::setw(12) << "Max" + << std::left << std::setw(12) << "Average" + << std::endl; + for (int j = 0; j < 4; j++) + { + std::cout + << std::left << std::setw(12) << labels[j] + << std::left << std::setw(12) << 1.0E-06 * sizes[j]/min[j] + << std::left << std::setw(12) << min[j] + << std::left << std::setw(12) << max[j] + << std::left << std::setw(12) << avg[j] + << std::endl; + } - } - // Catch OpenCL Errors and display information - catch (cl::Error& e) - { - std::cerr - << "Error: " - << e.what() - << "(" << e.err() << ")" - << std::endl; - } - catch (std::exception& e) - { - std::cerr - << "Error: " - << e.what() - << std::endl; - } + } + // Catch OpenCL Errors and display information + catch (cl::Error& e) + { + std::cerr + << "Error: " + << e.what() + << "(" << e.err() << ")" + << std::endl; + } + catch (std::exception& e) + { + std::cerr + << "Error: " + << e.what() + << std::endl; + } } unsigned getDeviceList(std::vector& devices) @@ -321,93 +321,93 @@ unsigned getDeviceList(std::vector& devices) std::string getDeviceName(const cl::Device& device) { - std::string name; - cl_device_info info = CL_DEVICE_NAME; + std::string name; + cl_device_info info = CL_DEVICE_NAME; - // Special case for AMD + // Special case for AMD #ifdef CL_DEVICE_BOARD_NAME_AMD - device.getInfo(CL_DEVICE_VENDOR, &name); - if (strstr(name.c_str(), "Advanced Micro Devices")) - info = CL_DEVICE_BOARD_NAME_AMD; + device.getInfo(CL_DEVICE_VENDOR, &name); + if (strstr(name.c_str(), "Advanced Micro Devices")) + info = CL_DEVICE_BOARD_NAME_AMD; #endif - device.getInfo(info, &name); - return name; + device.getInfo(info, &name); + return name; } int parseUInt(const char *str, cl_uint *output) { - char *next; - *output = strtoul(str, &next, 10); - return !strlen(next); + char *next; + *output = strtoul(str, &next, 10); + return !strlen(next); } void parseArguments(int argc, char *argv[]) { - for (int i = 1; i < argc; i++) - { - if (!strcmp(argv[i], "--list")) + for (int i = 1; i < argc; i++) { - // Get list of devices - std::vector devices; - getDeviceList(devices); - - // Print device names - if (devices.size() == 0) - { - std::cout << "No devices found." << std::endl; - } - else - { - std::cout << std::endl; - std::cout << "Devices:" << std::endl; - for (unsigned i = 0; i < devices.size(); i++) + if (!strcmp(argv[i], "--list")) { - std::cout << i << ": " << getDeviceName(devices[i]) << std::endl; + // Get list of devices + std::vector devices; + getDeviceList(devices); + + // Print device names + if (devices.size() == 0) + { + std::cout << "No devices found." << std::endl; + } + else + { + std::cout << std::endl; + std::cout << "Devices:" << std::endl; + for (unsigned i = 0; i < devices.size(); i++) + { + std::cout << i << ": " << getDeviceName(devices[i]) << std::endl; + } + std::cout << std::endl; + } + exit(0); } - std::cout << std::endl; - } - exit(0); - } - else if (!strcmp(argv[i], "--device")) - { - if (++i >= argc || !parseUInt(argv[i], &deviceIndex)) - { - std::cout << "Invalid device index" << std::endl; - exit(1); - } - } - else if (!strcmp(argv[i], "--arraysize") || !strcmp(argv[i], "-s")) - { - if (++i >= argc || !parseUInt(argv[i], &ARRAY_SIZE)) - { - std::cout << "Invalid array size" << std::endl; - exit(1); - } - } - else if (!strcmp(argv[i], "--float")) - { - useFloat = true; - } - else if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) - { - std::cout << std::endl; - std::cout << "Usage: ./gpu-stream-ocl [OPTIONS]" << std::endl << std::endl; - std::cout << "Options:" << std::endl; - std::cout << " -h --help Print the message" << std::endl; - std::cout << " --list List available devices" << std::endl; - std::cout << " --device INDEX Select device at INDEX" << std::endl; - std::cout << " -s --arraysize SIZE Use SIZE elements in the array" << std::endl; - std::cout << " --float Enable use of floats instead of doubles" << std::endl; - std::cout << std::endl; - exit(0); - } - else - { - std::cout << "Unrecognized argument '" << argv[i] << "' (try '--help')" + else if (!strcmp(argv[i], "--device")) + { + if (++i >= argc || !parseUInt(argv[i], &deviceIndex)) + { + std::cout << "Invalid device index" << std::endl; + exit(1); + } + } + else if (!strcmp(argv[i], "--arraysize") || !strcmp(argv[i], "-s")) + { + if (++i >= argc || !parseUInt(argv[i], &ARRAY_SIZE)) + { + std::cout << "Invalid array size" << std::endl; + exit(1); + } + } + else if (!strcmp(argv[i], "--float")) + { + useFloat = true; + } + else if (!strcmp(argv[i], "--help") || !strcmp(argv[i], "-h")) + { + std::cout << std::endl; + std::cout << "Usage: ./gpu-stream-ocl [OPTIONS]" << std::endl << std::endl; + std::cout << "Options:" << std::endl; + std::cout << " -h --help Print the message" << std::endl; + std::cout << " --list List available devices" << std::endl; + std::cout << " --device INDEX Select device at INDEX" << std::endl; + std::cout << " -s --arraysize SIZE Use SIZE elements in the array" << std::endl; + std::cout << " --float Enable use of floats instead of doubles" << std::endl; + std::cout << std::endl; + exit(0); + } + else + { + std::cout << "Unrecognized argument '" << argv[i] << "' (try '--help')" << std::endl; - exit(1); + exit(1); + } } - } }