void swap(Array2D& a, int i1, int j1, int i2, int j2) { int val1 = a.getValueAt(i1, j1); int val2 = a.getValueAt(i2, j2); a.setValueAt(val2, i1, j1); a.setValueAt(val1, i2, j2); }
void EOTColumn(Array2D& a, int count, int columnNumber, int direction) { int numOfRepeats = (int)ceil((double)count / 2); int i, chunk; chunk = CHUNKSIZE; int repeat1 = 2 * (count / 2) - 1; //pocet opakovani prvniho cyklu int repeat2 = 2 * (int)floor((double)((count - 1) / 2)); //opakuj numOfRepeats x for (int j = 0; j < numOfRepeats; j++) { //paralelni blok s polem A a promennou chunk #pragma omp parallel num_threads(NUM_OF_THREAD) shared(a,count,chunk,repeat1,repeat2) private(i) { //licho-sude dvojce #pragma omp for schedule(dynamic,chunk) for (i = 0; i < repeat1; i += 2) { //compare and exchange int val1 = a.getValueAt(i, columnNumber); int val2 = a.getValueAt(i + 1, columnNumber); if (compare(val1, val2, direction) == false) { //pokud poradni neni spravne swap(a, i, columnNumber, i + 1, columnNumber); } } //sudo-liche dvojce #pragma omp for schedule(dynamic,chunk) for (i = 1; i < repeat2; i += 2) { //compare and exchange int val1 = a.getValueAt(i, columnNumber); int val2 = a.getValueAt(i + 1, columnNumber); if (compare(val1, val2, direction) == false) { //pokud poradni neni spravne swap(a, i, columnNumber, i + 1, columnNumber); } } } //end of paralel region } }