Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cstdlib>
- #include <omp.h>
- #include <cmath>
- #define THREAD_NUM 8
- int **arr;
- void initMemory(int k, int th){
- arr = new int*[th];
- omp_set_num_threads(th);
- for(int i = 0; i < th; i++){
- arr[i] = new int[k];
- }
- }
- void freeMemory(int th){
- for(int i = 0; i < th; i++){
- delete[] arr[i];
- }
- delete[] arr;
- }
- int getA(int a, int b, int k){
- for(int i = 0; i < k; i++){
- int lshi = k - i - 1;
- if(a & (1 << lshi)){
- b ^= (lshi > 0) ? (0x07 << (lshi - 1)) : (0x03);
- }
- }
- return b;
- }
- void print(int k, int tn){
- for(int i = 0; i < k; i++){
- for(int j = 0; j < k; j++){
- int lshi = k - j - 1;
- std::cout << (bool)(arr[tn][i] & (1 << lshi));
- }
- std::cout << " ";
- }
- std::cout << std::endl;
- }
- void bruteLoop(int k){
- int range = pow(2, k) - 1;
- #pragma omp parallel
- {
- int a;
- int b;
- int th = omp_get_thread_num();
- #pragma omp for schedule(dynamic)
- for(int i = 0; i <= range; i++){
- arr[th][0] = i;
- a = getA(arr[th][0], 0, k);
- b = arr[th][0];
- for(int j = 1; j < k; j++){
- arr[th][j] = ~a;
- a = getA(arr[th][j], b, k);
- b = arr[th][j];
- }
- #pragma omp critical
- if((a & range) == (-1 & range)){
- print(k, th);
- }
- }
- }
- }
- int main(int argc, char *argv[])
- {
- if(argc < 2){
- return -1;
- }
- else{
- int k = atoi(argv[1]);
- if(k < 1 || k > 24){
- return -2;
- }
- else{
- initMemory(k, THREAD_NUM);
- bruteLoop(k);
- freeMemory(THREAD_NUM);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement