77 lines
1.8 KiB
C++
77 lines
1.8 KiB
C++
#pragma once
|
|
|
|
#include "Mandelbrot.interface.h"
|
|
|
|
class CMandelbrotPOSIX: public IMandelbrot {
|
|
|
|
pthread_t* m_posixthreads;
|
|
|
|
static void* calcPOSIX(void* _params){
|
|
|
|
CParams* params = (CParams*) _params;
|
|
|
|
double startR = params->m_minRe + params->m_posix_begin*params->m_step;
|
|
|
|
for(int x_pos = params->m_posix_begin; x_pos < params->m_posix_end; x_pos++){
|
|
|
|
double startI = params->m_minIm;
|
|
|
|
for(int y_pos = params->m_y_height -1; y_pos >= 0; y_pos--){
|
|
|
|
checkNumber(*params, startR, startI, x_pos, y_pos);
|
|
startI += params->m_step;
|
|
|
|
}
|
|
|
|
startR += params->m_step;
|
|
|
|
}
|
|
}
|
|
|
|
void calc(CParams& params){
|
|
|
|
if(params.m_threads > params.m_x_width){
|
|
params.m_threads = params.m_x_width;
|
|
}
|
|
|
|
m_posixthreads = (pthread_t*)malloc(params.m_threads*sizeof(pthread_t)); // reserve memory for the threads
|
|
|
|
int array_step = params.m_x_width / params.m_threads;
|
|
|
|
for (unsigned i=0;i<params.m_threads-1;i++){
|
|
//calc array-part here
|
|
CParams* p = params.copy();
|
|
|
|
p->m_posix_begin = array_step*i;
|
|
p->m_posix_end = array_step*(i+1);
|
|
|
|
pthread_create(&m_posixthreads[i],NULL,calcPOSIX, (void *)p); // create thread
|
|
}
|
|
|
|
//last Thread
|
|
//calc array-part here
|
|
CParams* p = params.copy();
|
|
p->m_posix_begin = array_step*(params.m_threads-1);
|
|
p->m_posix_end = params.m_x_width;
|
|
pthread_create(&m_posixthreads[params.m_threads-1],NULL,calcPOSIX, (void *)p); // create thread
|
|
|
|
// wait for termination of all threads
|
|
for(unsigned i=0;i<params.m_threads;i++){
|
|
pthread_join(m_posixthreads[i],NULL);
|
|
}
|
|
|
|
// free memory
|
|
free(m_posixthreads);
|
|
return;
|
|
}
|
|
|
|
public:
|
|
|
|
CMandelbrotPOSIX(int x_width, int y_height, int iterations, unsigned int threads, bool sse){
|
|
Init(x_width,y_height,iterations,threads,sse);
|
|
}
|
|
|
|
~CMandelbrotPOSIX(){
|
|
Exit();
|
|
}
|
|
}; |