Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- __global__ void SW_GPU(double* memory,long int const m,long int const n, double const d, double const e, long int const N,const char* s1, const char* s2,int* semaphore)
- {
- //extern __shared__ int s[];
- //printf("Bez: %d, blockDim: %d, n = %ld\n",(int)n,blockDim.x,n);
- int index = threadIdx.x + blockIdx.x * blockDim.x;
- int stride = blockDim.x * gridDim.x;
- //printf("index: %d Stride: %d N: %ld\n",index,stride,N);
- //printf("%f\n",(float)(m-1)/(blockDim.x/2));
- //printf("blockIdx.x-int((double)(n-1)/(blockDim.x/2)) = %f\n",blockIdx.x-int((double)(n-1)/(blockDim.x/2)));
- //printf("semaphore[blockIdx.x-int((double)(n-1)/(blockDim.x/2))] = %f \n",semaphore[blockIdx.x-int((double)(n-1)/(blockDim.x/2))]);
- //printf("index = %d, blockidx = %d, Semaphor = %d\n",index,blockIdx.x,semaphore[blockIdx.x]);
- //printf("gridDim: %d\n",gridDim.x);
- for (int i = index; i < N; i += stride)
- {
- __syncthreads();
- while(1)
- {
- //printf("index = %d i = %d, blockidx = %d, threadID = %d, Semaphor = %d, memory = %f\n",index,i,blockIdx.x,threadIdx.x,semaphore[blockIdx.x],memory[i-1]);
- if(i==0) break;
- //if(blockIdx.x<(int)(double)(n-1)/(blockDim.x/2) && semaphore[blockIdx.x-1]==1) break;
- //if(blockIdx.x>=(int)(double)(n-1)/(blockDim.x/2) && semaphore[blockIdx.x-1]==1 && semaphore[blockIdx.x-int((double)(n-1)/(blockDim.x/2))]==1) break;
- //if(blockIdx.x%(int)(double)(n-1)/(blockDim.x/2)==0 && semaphore[blockIdx.x-int((double)(n-1)/(blockDim.x/2))]==1) break;
- if(i<(int)n && semaphore[(i-1)%gridDim.x]>0)
- {
- semaphore[(i-1)%gridDim.x]--;
- break;
- }
- if(i>=(int)n && semaphore[(i-1)%gridDim.x]>0 && semaphore[(i-int(n))%gridDim.x]>0)
- {
- semaphore[(i-int(n))%gridDim.x]--;
- semaphore[(i-1)%gridDim.x]--;
- break;
- }
- if(i%(int)n==0 && semaphore[(i-int(n))%gridDim.x]>0)
- {
- semaphore[(i-int(n))%gridDim.x]--;
- break;
- }
- }
- if(i%n!=0 && i > n)
- {
- double simil;
- if(s1[find_index_left(i,n)]==s2[find_index_upper(i,n)]) simil = 1;
- else simil = -3;
- //printf("Hello from block %d, thread %d, index %d, Memory is %f\n", blockIdx.x, threadIdx.x,index,memory[index]);
- //printf("Index: %d\n", i);
- //printf("memory[i-n-1] = %f\n", memory[i-n-1]);
- //printf("find_L:\n");
- //printf("find_ind_l = %d\n",find_index_left(i,n));
- //printf("s1[find_index_left(i,n)] = %c\n",s1[find_index_left(i,n)]);
- //printf("s1 finished\n");
- //printf("s2[find_index_upper(i,n)] = %c\n",s2[find_index_upper(i,n)]);
- //printf("s2 finished\n");
- //printf("sim: = %f\n",simil);
- //printf("sim finished\n");
- //printf("Index: %d, memory[i-n-1] = %f, sim: %d find_ind_l = %d, find_ind_u = %d, memory[i-n] = %f, memory[i-1] = %f\n",i, memory[i-n-1],simil, find_index_left(i,n), find_index_upper(i,n), memory[i-n], memory[i-1]);
- memory[i]=max((double)0,max(memory[i-n-1]+simil,max(memory[i-n] - d,memory[i-1] - d)));
- }
- semaphore[(blockIdx.x)%gridDim.x]=2;
- }
- //semaphore[blockIdx.x+1]=1;
- //semaphore[blockIdx.x+n]=1;
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement