2 // Extraído y adaptado de
3 // http://developer.amd.com/tools-and-sdks/opencl-zone/opencl-resources/introductory-tutorial-to-opencl/
5 #include "vectorUtils.hpp"
6 #include "commonArrayMult.hpp"
15 #include <chrono> // Para medir tiempos de ejecución
17 using namespace std::chrono;
18 #include <iomanip> // Para std::setprecision
21 #include "PerformanceTestArrayOpParallel.hpp"
22 //#define __NO_STD_VECTOR // Use cl::vector instead of STL version
24 int main (int argc, char* argv[]) {
29 unsigned long numberOfIterations = 1;
30 unsigned int size = 2048;
37 string outputFileName = "", deviceName;
38 std::shared_ptr<LPISupport::SampleCollection> pSamples = make_shared<LPISupport::SampleCollection>("execution time");
41 PerformanceTestArrayOpParallel* pPerfTest = new PerformanceTestArrayOpParallel(argc, argv);
42 auto pConfigTraits = std::dynamic_pointer_cast<PerformanceTestArrayOpParallel::ConfigTraits>(pPerfTest->getConfigTraits());
43 size = pConfigTraits->size;
44 numberOfIterations = pConfigTraits->repetitions;
45 std::cout << "read size: " << size << std::endl;
53 const unsigned int SHOW_SIZE = 10;
54 // Número de operaciones es ColsA productos de dos números y ColsA-1 sumas
55 // de dos números por cada elemento de la matriz resultado, que tiene
56 // RowsC*ColsC elementos.
57 unsigned long numOpsPerIteration = RowsC*ColsC;
58 pConfigTraits->numOpsPerCalc = numOpsPerIteration;
60 cerr << argv[0] << " performance measurement" << std::endl;
61 cout << "Starting program... " << flush;
62 cout << "Creating and filling arrays ... " << flush;
63 initArray(A, RowsA, ColsA, 2.0);
64 initArray(B, RowsB, ColsB, 2.0);
65 initArray(C, RowsC, ColsC, 0.0);
66 cout << "Done." << endl;
67 print_array("a", A, RowsA, ColsA, SHOW_SIZE);
68 print_array("b", B, RowsB, ColsB, SHOW_SIZE);
71 cerr << "Executing " << numberOfIterations << " iteration(s)\n";
72 cerr << "- Matrix [1 .. " << size << ", 1 .. " << size << "]" << endl;
74 TIME_DIFF_TYPE diffT2T1 = 0;
75 cout << "Starting product... " << endl;
76 for (unsigned int iteration = 0; iteration < numberOfIterations; iteration++) {
77 cout << "Iteration #" << iteration << std::endl;
81 cerr << "OpenMP enabled" << std::endl;
82 cerr << "OpenMP execution on GPU enabled" << std::endl;
83 //#pragma omp target map(to:A[0:RowsA*ColsA],B[0:RowsB*ColsB]) map(from:C[0:RowsC*ColsC])
84 #pragma omp target teams distribute
85 #endif //USE_OPENMP_GPU
87 cerr << "OpenMP execution on GPU disabled" << std::endl;
88 cerr << "Number of threads for CPU: " << omp_get_max_threads() << std::endl;
89 #pragma omp parallel for
90 #endif /* USE_OPENMP_CPU */
91 #ifdef USE_OPENACC_GPU
92 cerr << "OpenACC enabled" << std::endl;
93 cerr << "OpenACC execution on GPU enabled" << std::endl;
94 #pragma acc target teams distribute parallel for
96 #ifdef USE_OPENACC_CPU
97 cerr << "OpenACC execution on GPU disabled" << std::endl;
98 cerr << "Number of threads for CPU: " << omp_get_max_threads() << std::endl;
102 //#pragma acc parallel //#pragma acc kernels
103 #endif //USE_OPENACC_CPU
104 for (row = 0; row < RowsA; row ++) {
107 #ifdef USE_OPENMP_GPU /* OpenMP on GPU */
108 #pragma omp target parallel for
109 #endif // USE_OPENMP_GPU
110 #ifdef USE_OPENMP_CPU /* OpenMP on CPU */
111 #pragma omp parallel for
112 #endif //USE_OPENMP_GPU
113 #ifdef USE_OPENACC_GPU /* OpenACC on GPU */
114 #pragma acc target teams distribute parallel for
115 #endif // OpenACC on GPU
116 #ifdef USE_OPENACC_CPU
117 //#pragma acc kernels
118 //#pragma acc parallel loop gang vector //#pragma acc kernels
120 #endif //USE_OPENACC_CPU
121 for (col = 0; col < ColsA; col ++) {
123 C[row*ColsC+col] = A[row*ColsC+col] + B[row*ColsC+col];
126 #ifdef USE_OPENACC_CPU
130 TIME_DIFF(diffT2T1, t1, t2);
131 pSamples->appendSample(diffT2T1);
133 cout << "Product finished." << endl;
134 print_array<float>("c", C, RowsC, ColsC, SHOW_SIZE);
136 #if defined(USE_OPENMP_GPU) || defined(USE_OPENACC_GPU)
137 pConfigTraits->deviceType = "GPU";
139 pConfigTraits->deviceType = "CPU";
141 pPerfTest->buildTestInfo(pSamples);
142 pPerfTest->saveOrPrint();
145 } catch(string msg) {
146 cerr << "Exception caught in main(): " << msg << endl;