Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 14.07.2014, 16:19   #1
AlexVI
Пользователь
 
Регистрация: 25.11.2006
Сообщений: 40
По умолчанию как ускорить

Есть вот такой код:
Код:
for (i=0; i<N; i++) // длина массива может принимать значения 720 и больше
{
      llrp1[i]=Buf[i]+128; // значения флоат
      for (j=0; j<code_node[i].size; j++) //может принимать size = от 11 до 36
      {
         code_node[i].pi1[j] = llrp1[i];
      }
}
Buf - массив (длиной допустим 4000 символов)
code_node[i] - предаставляет из себя структуру с переменными size;index;pi1;
подскажите как можно ускорить этот код

Последний раз редактировалось AlexVI; 14.07.2014 в 17:18.
AlexVI вне форума Ответить с цитированием
Старый 14.07.2014, 17:07   #2
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А почему ты решил что этот код работает медленно?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 14.07.2014, 17:13   #3
Bugrimov
C/C++, Java
Участник клуба
 
Аватар для Bugrimov
 
Регистрация: 28.03.2012
Сообщений: 1,679
По умолчанию

AlexVI может вы имели в виду оптимизировать код? Тогда чем вас это не устраивает... ?
"Keep it simple" - придерживайтесь простоты!
Уильям Оккам - "Не следует множить сущее без необходимости"
Сложность - враг простоты и удобства!
Bugrimov вне форума Ответить с цитированием
Старый 14.07.2014, 17:15   #4
AlexVI
Пользователь
 
Регистрация: 25.11.2006
Сообщений: 40
По умолчанию

хотелось ускорить или оптимизировать мне нужны любые идеи какие есть. У самого уже закончились. Просто это только часть всего кода (это код декодера LLR BP). Начал с этой части кода.

Может как то лучше и быстрее реализовать через регистры или ассембл вставками или массив переделать в стандартный вектор C++ что позволит быстрее работать с этим вектором......

сам код следующий:

Код:
сам код следующий:

#define MAX_RANDOM     LONG_MAX   // Maximum value of random() 
#define NODES             16384   // Maximum of number of code/check nodes
#define J                    17   // Maximum number of checks per code bit
#define K                    17   // Maximum number of code bits per check

int max_size_M;
int max_size_N;

int n;                            // length
int k;                            // dimension
int nk;                           // redundancy
float  rate;                      // code rate

int M,N;                          // Size of parity-check matrix

// ---------------
// NODE STRUCTURES
// ---------------

struct parent_node {
    int size;
    int index[J];                     // indexes of children
    float pi1[J], pi0[J];             // messages "pi" to children
    };

struct child_node {
    int size;
    int index[K];                     // indexes of parents 
    float lambda1[K], lambda0[K];     // messages "lambda" to parents
    };

struct parent_node code_node[NODES];
struct child_node check_node[NODES];

double init_snr, final_snr, snr_increment;
double sim, num_sim, ber, amp;
long seed;
int error;
int data[NODES], codeword[NODES];
int data_int;
double snr, snr_rms;
float  transmited[NODES], received[NODES];
int hard[NODES], decoded[NODES];
int i,j, iter, max_iter;



void log_belprop()
{
int i,j,l,iter;
int m,aux;
float alpha;
float delt;
int sign;
float llrp1[NODES];                       // Prior probabilities (channel)
float q0[NODES], q1[NODES];               // Pseudo-posterior probabilities

  // -------------------
  // ***** STEP 0 *****
  // INITIALIZATION STEP
  // -------------------

  // Prior log-likelihood ratios (channel metrics)

  for (i=0;i<N;i++)
    {
    // LOOK-UP TABLE (LUT)
    llrp1[i] = received[i]*snr_rms;
    }

  // For every (m,l) such that there is a link between parents and
  // children, qm0[i][j] and qm1[i][j] are initialized to pl[j].
  // Notation: pi (Pearl) = q (MacKay)

  for (i=0; i<N; i++)                         // run over code nodes
    {

    for (j=0; j<code_node[i].size; j++)       // run over check nodes
      {

      code_node[i].pi1[j] = llrp1[i];

      }
    }

  iter = 0;                  // Counter of iterations

  do {

  // ---------------------------------------
  //         ***** STEP 1 *****
  // HORIZONTAL STEP = BOTTOM-UP PROPAGATION
  // ---------------------------------------
  //
  // MacKay:
  // Run through the checks m and compute, for each n in N(m) the
  // probabilitiy of a check symbol when code symbol is 0 (or 1)
  // given that the other code symbols have distribution qm0, qm1
  //
  // Pearl:
  // Node x_m computes new "lambda" messages to be sent to its parents
  // u_1, u_2, ..., u_K

  for (i=0; i<M; i++)
    for (j=0; j<check_node[i].size; j++)
      {
      delt = 0.0;
      sign = 0;                           // Keep track of sign of delt

      for (l=0; l<check_node[i].size; l++)
        {
        aux = check_node[i].index[l];

        if (aux != check_node[i].index[j])
          {
          // --------------------------------------------------------
          //  Compute the index "m" of the message from parent node
          // --------------------------------------------------------
          m = 0;
          while (  ( (code_node[aux-1].index[m]-1) != i )
                          && ( m < code_node[aux-1].size)  ) m++;

          if (code_node[aux-1].pi1[m] < 0.0) sign ^= 1;
          delt += F(fabs(code_node[aux-1].pi1[m]));

          }
        }
      if (sign == 0)
        check_node[i].lambda1[j] = F(delt);
      else
	check_node[i].lambda1[j] = -F(delt);

      // Normalization
      if (check_node[i].lambda1[j] < -30.0)
        check_node[i].lambda1[j] = -30.0;

      }

  // Increment the number of iterations, and check if maximum reached

  iter++;

  } while (iter < max_iter);

}

Последний раз редактировалось Stilet; 14.07.2014 в 17:38.
AlexVI вне форума Ответить с цитированием
Старый 14.07.2014, 23:15   #5
AlexVI
Пользователь
 
Регистрация: 25.11.2006
Сообщений: 40
По умолчанию

Цитата:
Сообщение от AlexVI Посмотреть сообщение
Есть вот такой код:
Код:
for (i=0; i<N; i++) // длина массива может принимать значения 720 и больше
{
      llrp1[i]=Buf[i]+128; // значения флоат
      for (j=0; j<code_node[i].size; j++) //может принимать size = от 11 до 36
      {
         code_node[i].pi1[j] = llrp1[i];
      }
}
Buf - массив (длиной допустим 4000 символов)
code_node[i] - предаставляет из себя структуру с переменными size;index;pi1;
подскажите как можно ускорить этот код
ребята варианты есть очень надо
AlexVI вне форума Ответить с цитированием
Старый 15.07.2014, 07:09   #6
Smitt&Wesson
Старожил
 
Аватар для Smitt&Wesson
 
Регистрация: 31.05.2010
Сообщений: 13,543
По умолчанию

Применяйте вместо for - while, вроде как быстрее работает. И ещё, проход цикла делайте с "хвоста". Тоже немного быстрее выполняется.
Пиши пьяным, редактируй трезвым.
Справочник по алгоритмам С++ Builder
Smitt&Wesson вне форума Ответить с цитированием
Старый 15.07.2014, 09:26   #7
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,330
По умолчанию

Цитата:
Сообщение от Smitt&Wesson Посмотреть сообщение
Применяйте вместо for - while, вроде как быстрее работает. И ещё, проход цикла делайте с "хвоста". Тоже немного быстрее выполняется.
Надеюсь, это шутка?
waleri вне форума Ответить с цитированием
Старый 15.07.2014, 10:07   #8
AlexVI
Пользователь
 
Регистрация: 25.11.2006
Сообщений: 40
По умолчанию

шутка однозначно но все равно спасибо...
AlexVI вне форума Ответить с цитированием
Старый 15.07.2014, 17:53   #9
Zenon
Пользователь
 
Регистрация: 03.07.2014
Сообщений: 32
По умолчанию

1. Вы каждое значение llrp1[i] используете только 1 раз, так что не надо их хранить в массиве и потом каждый раз доставать. И сам массив не нужен.
2. Можно попробовать не вычислять каждый раз code_node[i].pi[j], и code_node[i].size (а вдруг компилятор не догадается соптимизировать):

Код:
for (i=0; i<N; i++) // длина массива может принимать значения 720 и больше
{
      float v= Buf[i]+128; // значения флоат
      parent_node *pn= code_node + i;
      float *p= pn->pi1;
      float *pEnd= p + pn->size;
      for (; p < pEnd; ++p) //может принимать size = от 11 до 36
          *p= v; 
}
Zenon вне форума Ответить с цитированием
Старый 15.07.2014, 21:55   #10
AlexVI
Пользователь
 
Регистрация: 25.11.2006
Сообщений: 40
По умолчанию

Цитата:
Сообщение от Zenon Посмотреть сообщение
1. Вы каждое значение llrp1[i] используете только 1 раз, так что не надо их хранить в массиве и потом каждый раз доставать. И сам массив не нужен.
2. Можно попробовать не вычислять каждый раз code_node[i].pi[j], и code_node[i].size (а вдруг компилятор не догадается соптимизировать):

Код:
for (i=0; i<N; i++) // длина массива может принимать значения 720 и больше
{
      float v= Buf[i]+128; // значения флоат
      parent_node *pn= code_node + i;
      float *p= pn->pi1;
      float *pEnd= p + pn->size;
      for (; p < pEnd; ++p) //может принимать size = от 11 до 36
          *p= v; 
}
Уточню:
code_node[i] - это i-ый кодовый узел всего их допустим 4080
каждый кодовый узел связан с проверочными узлами check_node[i](всего их допустим 720). и code_node[i].size - это количество проверочных узлов связанных с данным кодовым и наоборот для check_node[i]. Значения или скажем номера этих проверочных узлов хранятся в code_node[i]->index[j].

Изначально все структуры
struct parent_node {
int size; // известно
int index[J]; // известно // indexes of children
float pi1[J]; // messages "pi" to children // ВЫЧИСЛЯЕМ !!!
};

struct child_node {
int size; // известно
int index[K]; // indexes of parents // известно
float lambda1[K]; // messages "lambda" t/ ВЫЧИСЛЯЕМ !!!
};

struct parent_node code_node[NODES];
struct child_node check_node[NODES];
AlexVI вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
VB: как ускорить вывод в консоль? studen Помощь студентам 0 03.07.2014 21:07
Как ускорить работу exel Fedis1 Microsoft Office Excel 2 17.04.2014 19:01
Как ускорить расчеты формул??? Иванов_ДМ Microsoft Office Excel 7 02.09.2009 09:53
Как ускорить программу ? juan666777 Общие вопросы Delphi 2 02.05.2009 19:48
Как ускорить работу с сетевой БД Ramires БД в Delphi 3 21.08.2008 12:16