Advertisement
Guest User

Untitled

a guest
Jun 17th, 2019
73
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.41 KB | None | 0 0
  1. #include "cuda_runtime.h"
  2. #include "device_launch_parameters.h"
  3.  
  4. #include <iostream>
  5. #include <stdio.h>
  6.  
  7. #include "thrust/host_vector.h"
  8. #include "thrust/device_vector.h"
  9. #include "thrust/scan.h"
  10. #include "thrust/scatter.h"
  11. #include "thrust/sort.h"
  12. #include "thrust/functional.h"
  13. #include "thrust/reduce.h"
  14. #include "thrust/copy.h"
  15. #include "thrust/remove.h"
  16. #include "thrust/device_ptr.h"
  17. #include <thrust/execution_policy.h>
  18.  
  19. #include <math.h>
  20. #include "device_atomic_functions.h"
  21. #include <set>
  22.  
  23. using namespace std;
  24.  
  25. __host__ __device__ long getV(int up, int down) {
  26.     long result = 1;
  27.     for (int i = up - down + 1; i <= up; i++) {
  28.         result *= i;
  29.     }
  30.     return result;
  31. }
  32.  
  33. __global__ void func(int* output, int* sequence, int* pattern, int* uniqueSequence,
  34.                     int numberOfDifferentInSequence, int numberOfDifferentInPattern, int patternSize, int sequenceSize) {
  35.     //prepare variables
  36.     int tid = blockIdx.x*blockDim.x + threadIdx.x;
  37.     int* variant = new int[numberOfDifferentInPattern]();
  38.  
  39.     int localTid = tid;
  40.  
  41.     int* localUniqueSequence = new int[sequenceSize]();
  42.     localUniqueSequence = uniqueSequence;
  43.  
  44.     //count variant for thread
  45.     for (int x = 0; x < numberOfDifferentInPattern; x++) {
  46.         int v = getV(numberOfDifferentInSequence - x - 1, numberOfDifferentInPattern - x - 1);
  47.         int t = localTid / v;
  48.         variant[x] = localUniqueSequence[t];
  49.  
  50.         for (int i = t; i < numberOfDifferentInSequence; i++) {
  51.             localUniqueSequence[i] = localUniqueSequence[i + 1];
  52.         }
  53.  
  54.         localUniqueSequence[numberOfDifferentInSequence - 1] = 0;
  55.  
  56.         localTid = localTid % v;
  57.     }
  58.  
  59.     int* finalPattern = new int[patternSize]();
  60.  
  61.     //subsitution
  62.     for (int i = 0; i < patternSize; i++) {
  63.         finalPattern[i] = variant[pattern[i] - 1];
  64.     }
  65.    
  66.     //find pattern in sequence
  67.     //int counter = 0;
  68.     //int counter2 = 0;
  69.     //for (int i = 0; i < patternSize; i++) {
  70.     //  for (int k = counter2; k < sequenceSize; k++) {
  71.     //      if (counter <= i) {
  72.     //          if (finalPattern[i] == sequence[k]) {
  73.     //              counter2 = k + 1;
  74.     //              counter++;
  75.     //          }
  76.     //      }
  77.     //  }
  78.     //}
  79.  
  80.     int localSequenceSize = sequenceSize;
  81.     int counter = 0;
  82.     int nextII = 0;
  83.     for (int i = 0; i < patternSize; i++) {
  84.         for (int ii = nextII; ii < localSequenceSize; ii++) {
  85.             if (counter <= i) {
  86.                 if (finalPattern[i] == sequence[ii]) {
  87.                     nextII = ii + 1;
  88.                     counter++;
  89.                 }
  90.             }
  91.         }
  92.     }
  93.  
  94.     //pattern found
  95.     if (counter == patternSize) {
  96.         for (int i = 0; i < patternSize; i++) {
  97.             output[tid * patternSize + i] = finalPattern[i];
  98.         }
  99.     }
  100.  
  101.     __syncthreads();
  102. }
  103.  
  104. int countUniqueLetters(thrust::host_vector<int> sequence) {
  105.     set<int> uniqueLettersInSequence;
  106.  
  107.     for (int i = 0; i < sequence.size(); i++) {
  108.         uniqueLettersInSequence.insert(sequence[i]);
  109.     }
  110.  
  111.     return uniqueLettersInSequence.size();
  112. }
  113.  
  114. thrust::host_vector<int> getUniqueSequence(thrust::host_vector<int> sequence) {
  115.     set<int> uniqueInSequence;
  116.  
  117.     for (int i = 0; i < sequence.size(); i++) {
  118.         uniqueInSequence.insert(sequence[i]);
  119.     }
  120.     thrust::host_vector<int> uniqueInSequenceVector(uniqueInSequence.begin(), uniqueInSequence.end());
  121.     return uniqueInSequenceVector;
  122. }
  123.  
  124. void projekt() {
  125.     thrust::host_vector<int> h_tab_out;
  126.     thrust::device_vector<int> d_tab_out;
  127.  
  128.     thrust::device_vector<int> sequence_device;
  129.     thrust::device_vector<int> pattern_device;
  130.     thrust::device_vector<int> uniqueSequence_device;
  131.  
  132.     thrust::host_vector<int> pattern;
  133.     pattern.push_back(1);
  134.     pattern.push_back(2);
  135.     pattern.push_back(2);
  136.     pattern.push_back(1);
  137.    
  138.     thrust::host_vector<int> sequence;
  139.     sequence.push_back(1);
  140.     sequence.push_back(2);
  141.     sequence.push_back(4);
  142.     sequence.push_back(3);
  143.     sequence.push_back(5);
  144.     sequence.push_back(3);
  145.     sequence.push_back(6);
  146.     sequence.push_back(2);
  147.     sequence.push_back(1);
  148.  
  149.     int numberOfDifferentInSequence = countUniqueLetters(sequence);
  150.     int numberOfDifferentInPattern = countUniqueLetters(pattern);
  151.  
  152.     int sequenceSize = sequence.size();
  153.     int patternSize = pattern.size();
  154.  
  155.     int variantsNumber = getV(numberOfDifferentInSequence, numberOfDifferentInPattern);
  156.  
  157.     //---------------------------------------------------------------------------------------------------------------//
  158.     cout << "Liczba roznych w patternie: " << numberOfDifferentInPattern << endl;
  159.     cout << "Liczba roznych w sekwencji: " << numberOfDifferentInSequence << endl;
  160.     cout << "Liczba wariancji: " << variantsNumber << endl;
  161.     //---------------------------------------------------------------------------------------------------------------//
  162.  
  163.     thrust::host_vector<int> uniqueSequence = getUniqueSequence(sequence);
  164.  
  165.     dim3 dimBlock(variantsNumber);
  166.     dim3 dimGrid(1);
  167.  
  168.     h_tab_out.resize(variantsNumber * patternSize);
  169.     d_tab_out.resize(variantsNumber * patternSize);
  170.  
  171.     uniqueSequence_device.resize(uniqueSequence.size());
  172.     sequence_device.resize(sequence.size());
  173.     pattern_device.resize(pattern.size());
  174.  
  175.     uniqueSequence_device = uniqueSequence;
  176.     sequence_device = sequence;
  177.     pattern_device = pattern;
  178.  
  179.     func << <dimGrid, dimBlock >> > (
  180.         d_tab_out.data().get(),
  181.         sequence_device.data().get(),
  182.         pattern_device.data().get(),
  183.         uniqueSequence_device.data().get(),
  184.         numberOfDifferentInSequence,
  185.         numberOfDifferentInPattern,
  186.         patternSize,
  187.         sequenceSize
  188.         );
  189.  
  190.     h_tab_out = d_tab_out; //Kopiowanie device->host
  191.  
  192.     for (int s = 0; s < h_tab_out.size(); s++) {
  193.         if (s % patternSize == 0) {
  194.             cout << endl;
  195.         }
  196.         cout << h_tab_out[s];
  197.     }
  198. }
  199.  
  200. int main() {
  201.     projekt();
  202.     return EXIT_SUCCESS;
  203. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement