Skip to content

Commit

Permalink
CA3
Browse files Browse the repository at this point in the history
  • Loading branch information
SM2A committed Dec 19, 2021
1 parent 46ef1df commit ecba5b4
Show file tree
Hide file tree
Showing 6 changed files with 65 additions and 26 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -6,4 +6,6 @@ CA2/Build
CA2/main
CA3/serial/*.out
CA3/parallel/*.out
CA3/serial/filtered.bmp
CA3/parallel/filtered.bmp
CA3/cmake-build-debug
2 changes: 1 addition & 1 deletion CA3/parallel/makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
COMPILER = g++
VERSION = -std=c++11
OPTION = -pthread
OPTION = -pthread -w
CC = ${COMPILER} ${VERSION} ${OPTION}

all: clean parallel
Expand Down
56 changes: 36 additions & 20 deletions CA3/parallel/readImg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ void *smoothing_r(void *) {
image.r[i][j] = pixel_avg('r', i, j);
}
}
return nullptr;
}

void *smoothing_g(void *) {
Expand All @@ -159,6 +160,7 @@ void *smoothing_g(void *) {
image.g[i][j] = pixel_avg('g', i, j);
}
}
return nullptr;
}

void *smoothing_b(void *) {
Expand All @@ -167,6 +169,7 @@ void *smoothing_b(void *) {
image.b[i][j] = pixel_avg('b', i, j);
}
}
return nullptr;
}

void smoothing() {
Expand All @@ -186,6 +189,7 @@ void *sepia_r(void *) {
else image.r[i][j] = red;
}
}
return nullptr;
}

void *sepia_g(void *) {
Expand All @@ -196,6 +200,7 @@ void *sepia_g(void *) {
else image.g[i][j] = green;
}
}
return nullptr;
}

void *sepia_b(void *) {
Expand All @@ -207,6 +212,7 @@ void *sepia_b(void *) {
else image.b[i][j] = blue;
}
}
return nullptr;
}

void sepia() {
Expand Down Expand Up @@ -246,29 +252,33 @@ void washed_out() {

for (int i = 0; i < rows; ++i) {
for (int j = 0; j < cols; ++j) {
image.r[i][j] = (image.r[i][j] * 0.4) + ((long)red * 0.6);
image.g[i][j] = (image.g[i][j] * 0.4) + ((long)green * 0.6);
image.b[i][j] = (image.b[i][j] * 0.4) + ((long)blue * 0.6);
image.r[i][j] = (image.r[i][j] * 0.4) + ((long) red * 0.6);
image.g[i][j] = (image.g[i][j] * 0.4) + ((long) green * 0.6);
image.b[i][j] = (image.b[i][j] * 0.4) + ((long) blue * 0.6);
}
}
}

void cross() {
void *cross_main(void *) {
for (int i = 1; i < rows - 1; ++i) {
for (int j = 0; j < cols; ++j) {
if (i == j) {
image.r[i][j] = 255;
image.g[i][j] = 255;
image.b[i][j] = 255;
image.r[i][i] = 255;
image.g[i][i] = 255;
image.b[i][i] = 255;

image.r[i + 1][j] = 255;
image.g[i + 1][j] = 255;
image.b[i + 1][j] = 255;
image.r[i + 1][i] = 255;
image.g[i + 1][i] = 255;
image.b[i + 1][i] = 255;

image.r[i - 1][j] = 255;
image.g[i - 1][j] = 255;
image.b[i - 1][j] = 255;
}
image.r[i - 1][i] = 255;
image.g[i - 1][i] = 255;
image.b[i - 1][i] = 255;
}
return nullptr;
}

void *cross_side(void *) {
for (int i = 1; i < rows - 1; ++i) {
for (int j = 0; j < cols; ++j) {
if ((i + j) == rows) {
image.r[i][j] = 255;
image.g[i][j] = 255;
Expand All @@ -284,6 +294,14 @@ void cross() {
}
}
}
return nullptr;
}

void cross() {
pthread_t threads[2];
pthread_create(&threads[0], nullptr, &cross_main, nullptr);
pthread_create(&threads[1], nullptr, &cross_side, nullptr);
for (unsigned long thread : threads) pthread_join(thread, nullptr);
}

int main(int argc, char *argv[]) {
Expand All @@ -302,12 +320,10 @@ int main(int argc, char *argv[]) {
sepia();
washed_out();
cross();
writeOutBmp24(fileBuffer, "/home/amin/CLionProjects/Operating_System_Course_Projects/CA3/parallel/filtered.bmp",
bufferSize);
writeOutBmp24(fileBuffer, "filtered.bmp", bufferSize);

auto end = chrono::high_resolution_clock::now();
cout << chrono::duration_cast<chrono::milliseconds>(end - begin).count()
<< " Milliseconds" << endl;
cout << chrono::duration_cast<chrono::milliseconds>(end - begin).count() << endl;

return 0;
}
21 changes: 21 additions & 0 deletions CA3/run.sh
Original file line number Diff line number Diff line change
@@ -0,0 +1,21 @@
count=1
s_sum=0
p_sum=0
make -C serial
make -C parallel
cd serial || exit
for _ in $(seq $count); do
s=$(./ImageFilters.out ut.bmp)
s_sum=$(($s_sum + $s))
done
cd ..
echo "Average time for $count serial executions = $(($s_sum / $count)) ms"
cd parallel || exit
for _ in $(seq $count); do
p=$(./ImageFilters.out ut.bmp)
p_sum=$(($p_sum + $p))
done
cd ..
echo "Average time for $count parallel executions = $(($p_sum / $count)) ms"
echo "Speedup"
echo "$s_sum/$p_sum" | bc -l
4 changes: 3 additions & 1 deletion CA3/serial/makefile
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
COMPILER = g++
VERSION = -std=c++11
CC = ${COMPILER} ${VERSION}
OPTION = -w
CC = ${COMPILER} ${VERSION} ${OPTION}


all: clean serial

Expand Down
6 changes: 2 additions & 4 deletions CA3/serial/readImg.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -249,12 +249,10 @@ int main(int argc, char *argv[]) {
sepia();
washed_out();
cross();
writeOutBmp24(fileBuffer, "filtered.bmp",
bufferSize);
writeOutBmp24(fileBuffer, "filtered.bmp", bufferSize);

auto done = chrono::high_resolution_clock::now();
cout << chrono::duration_cast<chrono::milliseconds>(done - started).count()
<< " Milliseconds" << endl;
cout << chrono::duration_cast<chrono::milliseconds>(done - started).count() << endl;

return 0;
}

0 comments on commit ecba5b4

Please sign in to comment.