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

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

Вернуться   Форум программистов > Работа для программиста > Фриланс
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 15.10.2009, 15:28   #1
Dimedrolum
 
Регистрация: 18.09.2009
Сообщений: 6
По умолчанию Нужен знающий человек.

Имеются функции на с++
Код:
double F(double me, double N, double t0, double j0, double lm, double x, double T)
{
double REZ=0, sqrtN=sqrt(N);
 for(double nx=1; nx<=sqrtN/2; nx++)
  for(double ny=1; ny<=sqrtN/2; ny++)
   {
	if ((me+lm*((1+x)*t0*(cos(2*M_PI*nx/sqrtN)+cos(2*M_PI*ny/sqrtN))-j0*(1-x)/2))/T<700)
	REZ+=1/(exp((me+lm*((1+x)*t0*(cos(2*M_PI*nx/sqrtN)+cos(2*M_PI*ny/sqrtN))-j0*(1-x)/2))/T)+1);
   }
return (4*(1+x)/N)*REZ+x-1;
}

double ds(double N, double t0, double j0, double x, double T, double lm_left, double lm_right, double lm_step)

{
double REZ=0e0, Meps0=T*log(2*x/(1-x)), sqrtN=sqrt(N),a,b;
 for(double lm=lm_left;lm<=lm_right;lm+=lm_step)
  {
   double Meps=Me(lm, x, T);
	for(double nx=1;nx<=sqrtN/2;nx++)
	  for(double ny=1;ny<=sqrtN/2;ny++)
	   {
		a=t0*(1+x)*(cos(2*M_PI*nx/sqrtN)+cos(2*M_PI*ny/sqrtN))-j0*(1-x)/2;
		b=Meps+lm*a;
		if (b/T<700) REZ+=b*(b-Meps0)*exp(b/T)/(lm*T*T*(exp(b/T)+1)*(exp(b/T)+1));
	   }
  }
    return 4*lm_step*REZ/N;
}

double sum1(double N, double t0, double j0, double lm, double x, double T)
{
 double REZ=0.0,sqrtN=sqrt(N),a,b,Meps=Me(lm,x,T);
  for(double nx=1;nx<=sqrtN/2;nx++)
   for(double ny=1;ny<=sqrtN/2;ny++)
	{
	 a=t0*(1+x)*(cos(2*M_PI*nx/sqrtN)+cos(2*M_PI*ny/sqrtN))+j0*(1-x)/2; b=Meps-lm*a;
	 if (b/T<200)
	 REZ+=(t0*(1+x)*(cos(2*M_PI*nx/sqrtN)+cos(2*M_PI*ny/sqrtN)))*exp(b/T)/((exp(b/T)+1)*(exp(b/T)+1));
	};
 return 4*REZ;
}

double sum2(double N, double t0, double j0, double lm, double x, double T)
{
 double REZ=0.0,sqrtN=sqrt(N),a,b,Meps=Me(lm,x,T);
  for(double nx=1;nx<=sqrtN/2;nx++)
   for(double ny=1;ny<=sqrtN/2;ny++)
	{
	 a=t0*(1+x)*(cos(2*M_PI*nx/sqrtN)+cos(2*M_PI*ny/sqrtN))+j0*(1-x)/2;
	 b=Meps-lm*a;
	 if (b/T<200) REZ+=exp(b/T)/((exp(b/T)+1)*(exp(b/T)+1));
	};
 return 4*REZ;
}
Собственно вопрос, будет ли заметен прирост производительности, если эти функции сделать вставками на ассемблере? (Интересен прирост в разы) Если да, то кто за какую сумму может взяться?
Dimedrolum вне форума Ответить с цитированием
Старый 15.10.2009, 17:03   #2
Black Fregat
Программист
Участник клуба
 
Аватар для Black Fregat
 
Регистрация: 23.06.2009
Сообщений: 1,772
По умолчанию

Мое личное мнение: просто от ассемблера прироста в разы не будет. Хороший компилятор должен оптимизировать такой код настолько, что руками намного лучше не сделаешь.

Можно попытаться оптимизировать математику под расширенные инструкции процессора, но навскидку не очевидно, что будет польза.

Можно попытаться покрутить алгоритмы преобразований, но это снова чисто математика.
Black Fregat вне форума Ответить с цитированием
Старый 17.10.2009, 03:20   #3
nworm
Пользователь
 
Регистрация: 08.11.2008
Сообщений: 15
По умолчанию

1. Лучше всего лезть в математику самой задачи (если повезёт, можно добиться серьезного успеха).

2. Если ничего не выйдет, далее разумно работать с гтовой программой, например попробовать сделать цикл по Im внутренним в функции ds и т.д. Здесь опять же нужно учитывать особенности реальных данных, смотреть, какие циклы длинные, какие - нет.

3. Далее, выигрыш может дать выбор хорошего компилятора (но не большой, не в несколько раз ) и параметров компиляции в этом компиляторе.

4. Потом можно переводить на ассемблер, здесь также можно получить прирост (особенно если всё это считается на каких-то специфических процессорах), но всё равно лучше всего смотреть математику самой задачи.

Математику могу посмотреть, если хотите, пишите (e-mail такой же, как сайт из подписи).

Последний раз редактировалось nworm; 17.10.2009 в 17:13.
nworm вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
выдает ошибку, нужен знающий человек Айат Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 1 01.04.2009 00:30
Нужен человек, который может написать программку для работы на GPU ATI и NVidia legonxt Фриланс 1 10.11.2008 09:58
нужен человек для раскрутки сайта! VProsvet Фриланс 10 08.11.2008 13:30
ДД. Нужен человек для поддержки программы, написанной в Microsoft Office Access 2003 gsvgsv Фриланс 1 06.09.2007 11:52