Показать сообщение отдельно
  #7  
Старый 13.02.2016, 12:52
Аватар для [BlinD]
[BlinD] [BlinD] вне форума
Генерал-майор
 
Регистрация: 14.08.2008
Адрес: I lost my home…
Сообщений: 312
Сказал(а) спасибо: 236
Поблагодарили 456 раз(а) в 67 сообщениях
[BlinD] Лидер Гильдии[BlinD] Лидер Гильдии[BlinD] Лидер Гильдии[BlinD] Лидер Гильдии[BlinD] Лидер Гильдии
По умолчанию

Ну и на будущее, если стоит 15 студия, ну или на крайняк 13 (ниже точно не работает), даже если сильно не заморачиваться, то в самых очевидных моментах можно вставить прагмы, чтобы распараллелить, не мало времени экономит =)

#include "stdafx.h"
#include <vector>
#include <fstream>
using namespace std;

bool g1(bool a, bool b, bool c, bool d)
{
return(a^b ^ (c&(d ^ 1)) ^ 1);
}
void main()
{
std::vector<int> vector;

ofstream f("analize17.txt");
const int len = 17;
bool ent[len + 2];//входной регистр
ent[len] = 0;
ent[len + 1] = 0;
int kol[131072];//выходы в 10ой форме для сортировки
bool ex[len];//выходной регистр
int count = 0;//счетчик различных выходов
//длина регистров
//первое преобразование из ent в ex
for (int i = 0;i < pow(2, len);i++)
{
int s = 0;
for (int k = 0;k < len;k++)
{
ent[k] = (bool)((i >> (len - 1 - k) & 1));
}
for (int j = 0;j < len;j++)
{
ex[((4 * j) % len)] = g1(ent[j], ent[j + 3], ent[j + 1], ent[j + 2]);

}
for (int k = 0;k < len;k++)
{
s = s + ex[k] * pow(2, len - 1 - k);
}
kol[i] = s;

}
//сортировка(стоит передалать для общего случая)
int temp;
for (int i = 0; i < pow(2, len); i++)
{
temp = kol[i];
#pragma loop(hint_parallel(8))
#pragma loop(ivdep)

for (int j = i + 1; j < pow(2, len); j++)
{
if (temp == kol[j])
kol[j] = -1;
}
}
//счетчик в отсортированном массиве

for (int i = 0;i < pow(2, len);i++)
{

if (kol[i] > 0)
{
f << kol[i] << endl;
vector.push_back(kol[i]);
count = count + 1;
}
}

f << "stage1:" << count;
f << endl;
//втрое-четвертое преобразование
for (int k = 0;k < 3;k++)
{
int count2 = 0;

int size = vector.size();

for (int i = 0;i < size;i++)
{
int s = 0;
for (int k = 0;k < len;k++)
{
ent[k] = (bool)((vector[i] >> (6 - k) & 1));
}
for (int j = 0;j < len;j++)
{
ex[((4 * j) % len)] = g1(ent[j], ent[j + 3], ent[j + 1], ent[j + 2]);

}
for (int k = 0;k < len;k++)
{
s = s + ex[k] * pow(2, 6 - k);

}
kol[i] = s;
}
//сортировка(стоит передалать для общего случая)
for (int i = 0; i < size; i++)
{
temp = kol[i];
#pragma loop(hint_parallel(8))
#pragma loop(ivdep)

for (int j = i + 1; j < pow(2, len); j++)
{
if (temp == kol[j])
kol[j] = -1;
}

}
//счетчик в отсортированном массиве
vector.erase(vector.begin(), vector.end());
for (int i = 0;i < pow(2, len);i++)
{

if (kol[i] > 0)
{
f << kol[i];
f << endl;
vector.push_back(kol[i]);
count2 = count2 + 1;
}
}

f << "stage" << k + 2 << ":" << count2 << endl;
}
f.close();
}


Предварительно нужно проект настроить.
__________________
Ответить с цитированием