PDA

View Full Version : گفتگو: راه های افزایش سرعت در c++



Nabege
یک شنبه 16 تیر 1392, 15:21 عصر
خواستم ببینم برای بالا بردن سرعت اجرای کدها در c++ چه راه ها و ترفند هایی وجود داره ؟

لطفا هر راهی و هر ترفندی برای بالا بردن سرعت بلدین بگین چون برنامه ای که دارم می نویسم به سرعت بالا خیلی نیاز داره .

بهروز عباسی
یک شنبه 16 تیر 1392, 15:39 عصر
کد های C و ++C در صورت Optimize بودن Compiler خیلی سریع اجرا میشن ولی شما میتونی از Inline Assembly هم استفاده کنی یا با استفاده از تکنیک ها و Libهای مختلفی برای پردازش موازی هست که میتونن بهت کمک کنن .

Nabege
یک شنبه 16 تیر 1392, 15:43 عصر
من پردازندم چند هسته ای نیست به خاطر همین نمی تونم از پردازش موازی استفاده کنم. ولی در مورد Optimize بودن Compiler و Inline Assembly میشه بهتر توضیح بدین یا مثال بزنید؟

UfnCod3r
یک شنبه 16 تیر 1392, 16:38 عصر
اخه این طوری که نمیشه چیزی گفت باید کد بزاری:عصبانی++:
با چیزایی مثل موازی کردن، چند خطی، اسمبل،،Data Align ، SSE و ...
همه اینا رو سرعت تاثیر داره
بیشتر به تونایی خود برنامه نویس بر می گرده هرچی بیشتر بلد باشی کد بهتری می زنی :لبخندساده:

Nabege
یک شنبه 16 تیر 1392, 16:42 عصر
من مشکلم تو کد نویسی نیست فقط میخوام ترفندهایی که در مورد سرعت بلد نیست یاد بگیرم.
اگه یه مثال بزنید خوب میشه.
در مورد Inline Assembly میشه توضیح بدین ؟

darknes666
یک شنبه 16 تیر 1392, 16:55 عصر
استفاده از اسمبلی تو C++‎ میشه Inline assembly


int main()
{


__asm{



}


}

تو vc++

Nabege
یک شنبه 16 تیر 1392, 16:56 عصر
خوب چطوری ؟
حالا اگر استفاده کردم سرعت تقریبا چند برابر میشه ؟؟؟

darknes666
یک شنبه 16 تیر 1392, 16:58 عصر
دوست عزیز تاثیرش در جاهای مختلف فرق داره.
بهتره سیستمو قویتر کرد تا استفاده از این روش.

Nabege
یک شنبه 16 تیر 1392, 17:01 عصر
من می خوام خود نرم افزارم قوی باشه !
حالا نگفتی به طور معمول واسه یه کد ساده سرعت چند برابر میشه ؟

darknes666
یک شنبه 16 تیر 1392, 17:02 عصر
گفتم که تو جاها ی مختلف فرق داره.
حتی به نحوه ی نوشته شدن کدها بستگی شدیدی داره.
چه بسا شما کدتو کند تر بنویسی.و C++‎‎ سریعتر باشه.
اگر میخوای نرم افزارت قوی باشه همین c++ کافیه.

Nabege
یک شنبه 16 تیر 1392, 17:03 عصر
در بهترین حالت چی ؟ بابا بلاخره یه رقمی بده دیگه ؟

UfnCod3r
یک شنبه 16 تیر 1392, 17:06 عصر
اخه عزیز من اینطور نیست که بگی فلان کنی سرعت انقدر بیشتر باشه
اول چیزی که می خوای رو بنویس
بعد چیزایی که مهم هستن و خیلی تکرا می شن و میشه بهینه کرد رو بشین بهینه کن
باید خیلی چیزا بلد باشی

darknes666
یک شنبه 16 تیر 1392, 17:06 عصر
بهترین حالتش اینه که 4برابر بشه البته من تا اینحد تونستم.(شاید بیشترم بشه کرد)

UfnCod3r
یک شنبه 16 تیر 1392, 17:07 عصر
شما کد بزار ما بهینه می کنیم :قهقهه:

darknes666
یک شنبه 16 تیر 1392, 17:08 عصر
حالا مگه چی میخوای بنویسی که اینقدر سرعت مهمه؟

Nabege
یک شنبه 16 تیر 1392, 17:09 عصر
دارم انجین شطرنج می نویسم.
اگه کامپایلر Optimize باشه چی ؟ اون موقع سرعت در بهترین حالت چند برابر میشه ؟

youngold
یک شنبه 16 تیر 1392, 17:22 عصر
شما لطف کن شرح کامل برنامتو بده

Nabege
یک شنبه 16 تیر 1392, 17:26 عصر
بابا خیلی طولانی فقط build کردنش 10 دقیقس نمی خوام وقتتون رو بگیرم شما فقط لطف کنید چیز هایی که گفتم رو بهم یاد بدین اگه هم نمی خواید اشکالی نداره حداقل یه مقاله در این رابطه بهم معرفی کنید.

omidshaman
یک شنبه 16 تیر 1392, 18:26 عصر
بابا خیلی طولانی فقط build کردنش 10 دقیقس نمی خوام وقتتون رو بگیرم شما فقط لطف کنید چیز هایی که گفتم رو بهم یاد بدین اگه هم نمی خواید اشکالی نداره حداقل یه مقاله در این رابطه بهم معرفی کنید.
خب لازم نیست که کل کدو بزاری اون قسمتایی که فکر می کنی خیلی طول می کشه رو بزار

Nabege
یک شنبه 16 تیر 1392, 18:37 عصر
__forceinline void alwm(int gg[][11][11],int sor[11][11])
{
int af=0;
gg[0][0][0]=0;
if (sor[1][1]!=15) sor[10][3]=1;
if (sor[8][1]!=15) sor[10][4]=1;
for (int s1=1;s1<9;s1++)
for (int s2=1;s2<9;s2++)
{
if (sor[s1][s2]!=0)
{
switch (sor[s1][s2])
{
case 3:
wp(gg,s1,s2,sor,af);
break;
case 9:
wn(gg,s1,s2,sor,af);
break;
case 12:
wb(gg,s1,s2,sor,af);
break;
case 15:
wr(gg,s1,s2,sor,af);
break;
case 27:
wq(gg,s1,s2,sor,af);
break;
case 126:
wk(gg,s1,s2,sor,af);
break;
}
}
af=gg[0][0][0];
}
wlok(gg,sor,af);
af=gg[0][0][0];
wrok(gg,sor,af);
af=gg[0][0][0];
return;
}

__forceinline void albm(int gg[][11][11],int sor[11][11])
{
int af=0;
gg[0][0][0]=0;
if (sor[1][8]!=-15) sor[10][5]=1;
if (sor[8][8]!=-15) sor[10][6]=1;
for (int s1=1;s1<9;s1++)
for (int s2=1;s2<9;s2++)
{
switch (sor[s1][s2])
{
case -3:
bp(gg,s1,s2,sor,af);
break;
case -9:
bn(gg,s1,s2,sor,af);
break;
case -12:
bb(gg,s1,s2,sor,af);
break;
case -15:
br(gg,s1,s2,sor,af);
break;
case -27:
bq(gg,s1,s2,sor,af);
break;
case -126:
bk(gg,s1,s2,sor,af);
break;
}
af=gg[0][0][0];
}
blok(gg,sor,af);
af=gg[0][0][0];
brok(gg,sor,af);
af=gg[0][0][0];
return;
}
در ضمن من همه ی تابع هاشو __forceinline کردم

maktoom
یک شنبه 16 تیر 1392, 19:38 عصر
سلام
شاید تاکید این دوستمون روی عدد چند برابر سریعتر شدن هم پر بیراه نباشه.
بالاخره هر الگوریتم یه درجه ای داره. که نسبت به واحد معینی و سرعت پردانزده و غیره میشه با تقریب بسیار خوبی زمان رو محاسبه کرد.
برای روش موازی که پیچیدگی زمانی به راحتی قابل محاسبست. در نتیجه بهبود رو هم میشه محاسبه کرد.
برای استفاده از اسمبلی هم حتما معیاری وجود داره تا بشه داخل محاسبات پیچیدگی زمانی داخلش کرد.

UfnCod3r
یک شنبه 16 تیر 1392, 19:55 عصر
کلا با دیدن ی تیکه کد نمیشه کاری کرد
باید کل برنامه باشه و خودت هم نوشته باشی و بدونی چی چقدر اجرا می شه و ..
احساس می کنم پست های منو نمی خونی
گفتم اینا رو یاد بگیر:عصبانی++:
Asembly
CallingConvention
Multi Thread
Multi Process
SIMD
Data Alignment

درضمن این جور چیزا رو هم هیچ وقت بهینه نمی کنن مگر اینکه طرف خیلی بی کار باشه
مثلا این ضرب ماتریس 4در4 هست که خودم با SSE بهینه کردم :لبخند: (هر گونه کپی برداری از این کد نامردیست)

void XMat4x4::Mul( const XMat4x4* a, const XMat4x4* b, XMat4x4* dst )
{
#ifndef XUSE_SSE

dst->m[0] = a->m[0] * b->m[0] + a->m[4] * b->m[1] + a->m[8] * b->m[2] + a->m[12] * b->m[3];
dst->m[1] = a->m[1] * b->m[0] + a->m[5] * b->m[1] + a->m[9] * b->m[2] + a->m[13] * b->m[3];
dst->m[2] = a->m[2] * b->m[0] + a->m[6] * b->m[1] + a->m[10] * b->m[2] + a->m[14] * b->m[3];
dst->m[3] = a->m[3] * b->m[0] + a->m[7] * b->m[1] + a->m[11] * b->m[2] + a->m[15] * b->m[3];

dst->m[4] = a->m[0] * b->m[4] + a->m[4] * b->m[5] + a->m[8] * b->m[6] + a->m[12] * b->m[7];
dst->m[5] = a->m[1] * b->m[4] + a->m[5] * b->m[5] + a->m[9] * b->m[6] + a->m[13] * b->m[7];
dst->m[6] = a->m[2] * b->m[4] + a->m[6] * b->m[5] + a->m[10] * b->m[6] + a->m[14] * b->m[7];
dst->m[7] = a->m[3] * b->m[4] + a->m[7] * b->m[5] + a->m[11] * b->m[6] + a->m[15] * b->m[7];

dst->m[8] = a->m[0] * b->m[8] + a->m[4] * b->m[9] + a->m[8] * b->m[10] + a->m[12] * b->m[11];
dst->m[9] = a->m[1] * b->m[8] + a->m[5] * b->m[9] + a->m[9] * b->m[10] + a->m[13] * b->m[11];
dst->m[10] = a->m[2] * b->m[8] + a->m[6] * b->m[9] + a->m[10] * b->m[10] + a->m[14] * b->m[11];
dst->m[11] = a->m[3] * b->m[8] + a->m[7] * b->m[9] + a->m[11] * b->m[10] + a->m[15] * b->m[11];

dst->m[12] = a->m[0] * b->m[12] + a->m[4] * b->m[13] + a->m[8] * b->m[14] + a->m[12] * b->m[15];
dst->m[13] = a->m[1] * b->m[12] + a->m[5] * b->m[13] + a->m[9] * b->m[14] + a->m[13] * b->m[15];
dst->m[14] = a->m[2] * b->m[12] + a->m[6] * b->m[13] + a->m[10] * b->m[14] + a->m[14] * b->m[15];
dst->m[15] = a->m[3] * b->m[12] + a->m[7] * b->m[13] + a->m[11] * b->m[14] + a->m[15] * b->m[15];

#else
__m128 xmmC1 = _mm_load_ps(a->m);
__m128 xmmC2 = _mm_load_ps(a->m + 4);
__m128 xmmC3 = _mm_load_ps(a->m + 8);
__m128 xmmC4 = _mm_load_ps(a->m + 12);

__m128 xmmR1 = _mm_load_ps(b->m);
__m128 xmmR2 = _mm_load_ps(b->m+4);

_mm_store_ps(dst->m, _mm_add_ps(_mm_add_ps(_mm_add_ps(
_mm_mul_ps(xmmC1, _mm_allw_ps(xmmR1))
,_mm_mul_ps(xmmC2, _mm_allx_ps(xmmR1)))
,_mm_mul_ps(xmmC3, _mm_ally_ps(xmmR1)))
,_mm_mul_ps(xmmC4, _mm_allz_ps(xmmR1))));

_mm_store_ps(dst->m+4, _mm_add_ps(_mm_add_ps(_mm_add_ps(
_mm_mul_ps(xmmC1, _mm_allw_ps(xmmR2))
,_mm_mul_ps(xmmC2, _mm_allx_ps(xmmR2)))
,_mm_mul_ps(xmmC3, _mm_ally_ps(xmmR2)))
,_mm_mul_ps(xmmC4, _mm_allz_ps(xmmR2))));

xmmR1 = _mm_load_ps(b->m+8);
xmmR2 = _mm_load_ps(b->m+12);

_mm_store_ps(dst->m+8, _mm_add_ps(_mm_add_ps(_mm_add_ps(
_mm_mul_ps(xmmC1, _mm_allw_ps(xmmR1))
,_mm_mul_ps(xmmC2, _mm_allx_ps(xmmR1)))
,_mm_mul_ps(xmmC3, _mm_ally_ps(xmmR1)))
,_mm_mul_ps(xmmC4, _mm_allz_ps(xmmR1))));

_mm_store_ps(dst->m+12, _mm_add_ps(_mm_add_ps(_mm_add_ps(
_mm_mul_ps(xmmC1, _mm_allw_ps(xmmR2))
,_mm_mul_ps(xmmC2, _mm_allx_ps(xmmR2)))
,_mm_mul_ps(xmmC3, _mm_ally_ps(xmmR2)))
,_mm_mul_ps(xmmC4, _mm_allz_ps(xmmR2))));
#endif

}

مصطفی ساتکی
دوشنبه 17 تیر 1392, 13:53 عصر
__forceinline void alwm(int gg[][11][11],int sor[11][11])
{
int af=0;
gg[0][0][0]=0;
if (sor[1][1]!=15) sor[10][3]=1;
if (sor[8][1]!=15) sor[10][4]=1;
for (int s1=1;s1<9;s1++)
for (int s2=1;s2<9;s2++)
{
if (sor[s1][s2]!=0)
{
switch (sor[s1][s2])
{
case 3:
wp(gg,s1,s2,sor,af);
break;
case 9:
wn(gg,s1,s2,sor,af);
break;
case 12:
wb(gg,s1,s2,sor,af);
break;
case 15:
wr(gg,s1,s2,sor,af);
break;
case 27:
wq(gg,s1,s2,sor,af);
break;
case 126:
wk(gg,s1,s2,sor,af);
break;
}
}
af=gg[0][0][0];
}
wlok(gg,sor,af);
af=gg[0][0][0];
wrok(gg,sor,af);
af=gg[0][0][0];
return;
}

__forceinline void albm(int gg[][11][11],int sor[11][11])
{
int af=0;
gg[0][0][0]=0;
if (sor[1][8]!=-15) sor[10][5]=1;
if (sor[8][8]!=-15) sor[10][6]=1;
for (int s1=1;s1<9;s1++)
for (int s2=1;s2<9;s2++)
{
switch (sor[s1][s2])
{
case -3:
bp(gg,s1,s2,sor,af);
break;
case -9:
bn(gg,s1,s2,sor,af);
break;
case -12:
bb(gg,s1,s2,sor,af);
break;
case -15:
br(gg,s1,s2,sor,af);
break;
case -27:
bq(gg,s1,s2,sor,af);
break;
case -126:
bk(gg,s1,s2,sor,af);
break;
}
af=gg[0][0][0];
}
blok(gg,sor,af);
af=gg[0][0][0];
brok(gg,sor,af);
af=gg[0][0][0];
return;
}
در ضمن من همه ی تابع هاشو __forceinline کردم

شما این همه branch زائد ایجاد کردید که چی ؟

static const int lut1[127] ={0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1};
if (lut1[sor[s1][s2]])
wp(gg,s1,s2,sor,af);

این کدی که قرار دادم یکی از تکنیک های branch pridection هستش تابع دوم را به همین ترتیب تغییر بدید.

موفق باشید.

Nabege
دوشنبه 17 تیر 1392, 14:28 عصر
آقای mostafa.sataki (http://barnamenevis.org/member.php?37538-mostafa.sataki) شما تو کدی که گذاشتین فقط تابع wp() بکار رفته په بقیه ی تابع ها چی ؟ اونا کجا رفتن ؟

مصطفی ساتکی
دوشنبه 17 تیر 1392, 14:56 عصر
آقای mostafa.sataki (http://barnamenevis.org/member.php?37538-mostafa.sataki) شما تو کدی که گذاشتین فقط تابع wp() بکار رفته په بقیه ی تابع ها چی ؟ اونا کجا رفتن ؟

اون branch اصلی تابع که در واقع core محسوب میشه همون switch هستش که کلاک زیادی براش مصرف میشه چون با روش شما branch مربوطه misprediction هستش و شما اتلاف کلاک خواهید داشت بقیه تابع نیاز به دستکاری نداره.

Nabege
دوشنبه 17 تیر 1392, 15:38 عصر
خوب من اینو فهمیدم ولی بلاخره به جوابم نرسیدم که شما چرا در کدتون فقط تابع wp رو بکار بردین در صورتی که اگر نگاه کنید تو دستور switch تابع های دیگه ای مثل wn ، wr ، wk و ... رو بکار بردم !!!

UfnCod3r
دوشنبه 17 تیر 1392, 15:47 عصر
اره اینم فکر خوبیه ولی عدد ها منفیه
تو کد شما اگه عدد مثبت باشه درسته.
این طوری درست تر کار می کنه

static const int lut1[127] ={0,0,0,1,0,0,0,0,0,1,0,0,1,0,0,1,0,0,0,0,0,0,0,0, 0,0,0,1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0, 0,0,1};
const int* lutEnd = lut1 + 127;
if (lutEnd[sor[s1][s2]])
wp(gg,s1,s2,sor,af);

UfnCod3r
دوشنبه 17 تیر 1392, 15:57 عصر
اینم ی مثال ساده
عوض این

switch(n)
{
case 1 :
func();
break;

case 3 :
func();
break;

case 4 :
func();
break;

case 5 :
func();
break;

case 6 :
func();
break;

case 8 :
func();
break;
}


این کارو می کنی

const int nums[] = {0, 1, 0, 1, 1, 1, 1, 0, 1 };
if(nums[n])
func();

Nabege
دوشنبه 17 تیر 1392, 15:58 عصر
بابا اگه یه کمی دقت کنین می بینین که این کده با قسمت switch کدی که من دادم یکی نیست چون تو اون کد تابع هایی مثل wr wn wk wb و ... بکار رفته نه فقط تابع wp .نمی دونم چرا به این دقت نمی کنین.

UfnCod3r
دوشنبه 17 تیر 1392, 16:03 عصر
اه اره راس می گی
خب تقصیر خودته چرا اسم تابع ها رو این طوری می زاری ادم گیج میشه دیگه:لبخند:
wp,wl,wr که نشد اسم

Nabege
دوشنبه 17 تیر 1392, 16:28 عصر
ولی به هر حال ترفند جالبی بود دستت درد نکنه:تشویق::تشویق::تشویق:

omidshaman
دوشنبه 17 تیر 1392, 17:15 عصر
اگر برنامت محاسبات تکراری زیاد داره میتونی اونارو با constexpr (مخصوص c++11 ) زمان کامپایل حساب کنی یک جا ذخیرشون کنی بعد تو برنامه ازشون استفاده کنی
واین که این کدی که شما گزاشتی سرعتش از این بیشتر نمی شه! بهتر بود یکی از فانکشن های اصلی رو میزاشتی مثل wp...

brightening-eyes
چهارشنبه 19 تیر 1392, 05:57 صبح
سعی کن آرایه هات رو ازنوع اشاره گر تعریف کنی
این به خاطر اینه که بتونی memory رو مدیریت کنی
از توابعی که <memory> بهت میده استفاده کن که بتونی اشاره گرها رو پاک کنی
چون هر چی متغیرها و آرایه هات کمتر باشن حافظه کمتری مصرف میشه و در نتیجه سرعت برنامه به شدت میره بالاتر
و اینکه برنامت رو به صورت Multi-threading بنویس که بتونه از تمام CPU استفاده کنه
حتما برنامه رو strip و optimize کن
این موجب این میشه که اولا سرعت برنامه بره بالاتر و در ثانی اینکه حجم برنامه کم بشه
از SSE استفاده کن تا سرعت برنامه بره بالاتر
اگه از MinGW استفاده میکنی از سویچ -mthreads استفاده کن که کامپایلرم یه جورایی تو multi-threading کمکت کنه
و اینکه سعی کن تعداد دستوراتی که مینویسی کمتر باشه تا سرعت بره بالاتر

mostafa_shaeri_tj
چهارشنبه 19 تیر 1392, 07:18 صبح
سعی کن حلقه های for که استفاده میکنی به جای اضافه کردن یه واحد به شمارنده در هر تکرار چند واحد اضافه کنی.
این روش رو تو یه مقاله خوندم. در ضمن کتابخانه lapack که مربوط به توابع جبر خطی میشه و توابعش فوق العاده بهینه هست هم تو توابعش از این روش استفاده کرده.
یه مثال ساده میارم تا بهتر متوجه شی :
این روش معمولیه که همه استفاده میکنن :
for(int i=0;i<10000;i++) x[i]=0;

این روش بهینه تره :
for(int i=0;i<10000;i+=4)
{
x[i]=0;
x[i+1]=0;
x[i+2]=0;
x[i+3]=0;
}

مصطفی ساتکی
چهارشنبه 19 تیر 1392, 07:38 صبح
سعی کن حلقه های for که استفاده میکنی به جای اضافه کردن یه واحد به شمارنده در هر تکرار چند واحد اضافه کنی.
این روش رو تو یه مقاله خوندم. در ضمن کتابخانه lapack که مربوط به توابع جبر خطی میشه و توابعش فوق العاده بهینه هست هم تو توابعش از این روش استفاده کرده.
یه مثال ساده میارم تا بهتر متوجه شی :
این روش معمولیه که همه استفاده میکنن :
for(int i=0;i<10000;i++) x[i]=0;

این روش بهینه تره :
for(int i=0;i<10000;i+=4)
{
x[i]=0;
x[i+1]=0;
x[i+2]=0;
x[i+3]=0;
}

تو سوالی که ایشون پرسیدند مشکل جای دیگری بود.
این تکنیک که شما عرض کردید تحت عنوان تکنیک unroll هستش و اکثر کامپایلر های خانوده C++‎ خودشان اینکار را به صورت خودکار انجام می دهند به این علت هستش که از miss cache در cache l2 جلوگیری میشه. در ضمن در موارد خاص هم شما می تونید کامپایلر را force کنید تا حلقه مورد نظر را به تعداد دلخواه شما unroll نماید برای unroll دستی از (progma unroll(n# استفاده نمایید.

Nabege
شنبه 22 تیر 1392, 14:54 عصر
سعی کن آرایه هات رو ازنوع اشاره گر تعریف کنی
این به خاطر اینه که بتونی memory رو مدیریت کنی
از توابعی که <memory> بهت میده استفاده کن که بتونی اشاره گرها رو پاک کنی
چون هر چی متغیرها و آرایه هات کمتر باشن حافظه کمتری مصرف میشه و در نتیجه سرعت برنامه به شدت میره بالاتر
و اینکه برنامت رو به صورت Multi-threading بنویس که بتونه از تمام CPU استفاده کنه
حتما برنامه رو strip و optimize کن
این موجب این میشه که اولا سرعت برنامه بره بالاتر و در ثانی اینکه حجم برنامه کم بشه
از SSE استفاده کن تا سرعت برنامه بره بالاتر
اگه از MinGW استفاده میکنی از سویچ -mthreads استفاده کن که کامپایلرم یه جورایی تو multi-threading کمکت کنه
و اینکه سعی کن تعداد دستوراتی که مینویسی کمتر باشه تا سرعت بره بالاتر

حالا من چندتا سوال دارم که امیدوارم بهشون پاسخ بدین:

1-چطوری می تونم برنامه رو به صورت Multi-threading بنویسم ؟

2-چطوری برنامه رو strip کنم ؟

3-SSE چیه چطوری می تونم ازش استفاده کنم ؟

4-MinGW چیه ؟

5--mthreads چیه ؟

Nabege
دوشنبه 24 تیر 1392, 15:22 عصر
بابا هیچ کی نیست جواب بده ؟ ما این جا علاف شدیم

مصطفی ساتکی
دوشنبه 24 تیر 1392, 20:57 عصر
برای Multi thread می تونید از کتابخانه TBB استفاده کنید که فوق العاده هستش البته از C++‎‎11 هم می تونید برای اینکار استفاده کنید.
strip هم در مود release vs خودش حذف می شه در gcc فکر کنم دقیق نمی دونم باید خودتون اینکارو انجام بدید.
توی sse هم شما با ریجسترهای 128 بیتی کار می کنید خلاصه کلام بجای اینکه چهار بار جمع 32 بیتی انجام بدید یکبار fetch می کنید هر 4 تا32 بیتی رو به یکباره جمع می کنید تو زمینه های داده های متوالی وجود داشته باشه مثل پردازش روی آرایه و تصویر کاربرد زیادی دازه و سرعت رو هم تا حدی افزایش می ده و برای اینکار بایستی چک کنید سیستم مقصد چه sse رو ساپورت می کنه .
MinGW همون gcc تحت ویندوز هستش.

brightening-eyes
سه شنبه 25 تیر 1392, 06:49 صبح
خوب چند روز اینجا نیومدم
یه آشنایی با multi-threading
وقتی شما نرم افزار رو به صورت multi-thread مینویسی به این معنیه که میگی از تمام رجیسترهای سی پی یو استفاده کن
حالا نرم افزار من مگه از multi-threading استفاده نمیکنه؟
جواب کاملا در حالت عادی منفیه
نرم افزار شما توی یه قسمت سی پی یو ران میشه و در نتیجه شما نمیتونی از سرعت بیشتری بهره مند بشی
خوب چه جوری کل سی پی یو رو کنترل کنم؟
با توابعی که تو <thread> و <mutex> بهت میده میتونی این کارو بکنی
یه قسمت سی پی یو رو لاک کنی تا نرم افزار ازش استفاده کنه و موقعی که تایم داده شده توسط شما تموم شد خودش آنلاک بشه و یا تا زمان خارج شدن برنامه لاک بمونه
خوب با این حساب میخوایم ببینیم چه جوری لاک میشه
یه سری کتابخونه مثل Tiny Thread++ و یا tbb و یا boost.thread هست که شما میتونی به صورت multi-threading برنامه بنویسی
اما سویچ -mthreads
این سویچ به شما کمک میکنه برنامه رو از طریق multi-threading کامپایل کنی که سی پی یو رو غیر از اون چیزی که نوشتی به صورت بهینه شده کنترل کنه
اما تو MinGW چجوری strip کنم
بعد از کامپایل کردن سورس به فایل آبجکت موقع لینک سویچ -s رو بهش میدین و لینک میکنین
sse چیه؟
یه سری دستوره که کامپایلر ازش برا لینکینگ استفاده میکنه که سرعت رو هم تا حدودی افزایش میده
MinGW چیه؟
یه سری نرم افزار لینوکسی مثل GCC, GDB, make و غیره هستش که تو سیستم عاملهای GNU وجود داره
سوال بود در خدمتم

Nabege
سه شنبه 25 تیر 1392, 16:04 عصر
بابا من هرچی می خوام پروژه مو کامپایل کنم دکمه کامپایل غیر فعاله ! دلیلش چیه ؟ دواش چیه ؟

brightening-eyes
سه شنبه 25 تیر 1392, 20:38 عصر
اولا اینکه از چه کامپایلر و چه Ide استفاده میکنی؟
ثانیا این میتونه به این بستگی داشته باشه که تو فایل پروژه دست برده باشی
مثلا اگه یه فایل sln تو ویژوال استودیو دارین باید همون جوری که هست بازش کنین نه با نوتپد یا وردپد و غیره و دستکاری کنین
من به شما MinGW و Code::blocks رو پیشنهاد میکنم
یه سرعت خیلی خفنی داره
هم تو ران و هم تو مدیریت برنامه و سی پی یو
فقط بدیش اینه که حجم exe رو زیاد میکنه
اونم به خاطر لینکینگه

Nabege
سه شنبه 25 تیر 1392, 21:07 عصر
من از کامپایلر ویژوال ستودیو استفاده می کنم .
ولی بلاخره نفهمیدم این MinGW چیه این روزا خیلی اسمشو می شنوم میشه توضیح بدین چون در این مورد انگار گنگ موندم.

darknes666
سه شنبه 25 تیر 1392, 21:40 عصر
من از کامپایلر ویژوال ستودیو استفاده می کنم .
ولی بلاخره نفهمیدم این MinGW چیه این روزا خیلی اسمشو می شنوم میشه توضیح بدین چون در این مورد انگار گنگ موندم.

http://en.wikipedia.org/wiki/MinGW

brightening-eyes
سه شنبه 25 تیر 1392, 23:28 عصر
MinGW یه سری نرم افزار اوپن سورسه مثل کامپایلر gcc و نرم افزار make بر روی ویندوزه
اگه تو این تاپیک خونده باشی گفتم با MinGW کامپایل کن
یعنی یه کامپایلر هست
غیر از زبانهای سی و سی پلاس پلاس زبانهای fortran, ada, pascal و غیره رو ساپورت میکنه
این کالکشن توپ که gcc هم توش باشه کاملا بر اساس استانداردهای C++‎11 هستش و شما میتونین با C++‎11 ازش استفاده کنین.
برای دانلودش میتونین برین
اینجا (http://mingw.org)

Nabege
چهارشنبه 26 تیر 1392, 19:08 عصر
آقا brightening-eyes چقدر زور دارین فقط یه دفعه ای همه ی سایتو ویرایش نکنید !

brightening-eyes
پنج شنبه 27 تیر 1392, 18:27 عصر
یکم اشتباه نوشته بودم گفتم درستش کنم.
ولی خودمونیم، زورم که خیلی زیاده
شمام میخوای زورت زیاد بشه ویرایش کن.
بحث تاپیکم به زور زیاد من نکش.
سوالت راجع سرعت بود.
راجع به زور زیاد میخوای بدونی پیام خصوصی بده.

Nabege
شنبه 29 تیر 1392, 15:58 عصر
نه بابا داشتم شوخی می کردم جدی نگیر!

brightening-eyes
شنبه 29 تیر 1392, 22:21 عصر
خوب یه کتابخونه برای threading هست و اسمش tinythread++ هست
خیلی خیلی قویه
میتونه سرعت رو خیلی ببره بالا
چون از تمام سی پی یو مستحفیض میشه
سرعتشم که خدارو شکر بالا
چون از کتابخونه C++11 استفاده میکنه
حجمشم کمه
همینطور اوپن سورسه

Nabege
یک شنبه 30 تیر 1392, 08:38 صبح
خوب من چطوری میتونم از این کتابخونه استفاده کنم ؟؟؟

brightening-eyes
چهارشنبه 02 مرداد 1392, 06:45 صبح
سلام چند روزی نبودم
جواب شما:
خیلی راحت
از
اینجا[/URL (
[URL]http://tinythreadpp.bitsnbites.eu)]
دانلودش میکنی
بعدش اگه خواستی tinythread.cpp رو کنار پروژه کامپایل میکنی
اگرم حال کردی کامپایل میکنی و به صورت یه static library درش میاری
که من راه دومی رو پیشنهاد میدم.
البته اون دوتا فایل tinythread.h و fast_mutex.h رو بریز تو اینکلود کامپایلر و بعدش تو tinythread.h این خط رو اضافه کن

#include "fast_mutex.h"
البته من دستکاری کردم اگه خواستی بگو برات بزارم الآن حالشو ندارم.

Nabege
چهارشنبه 02 مرداد 1392, 06:52 صبح
آره منم یه چند روزی نبودم .
اگه فایل های مورد نیاز دستکاری شده شما رو بزارید ممنون میشم .

brightening-eyes
پنج شنبه 03 مرداد 1392, 17:19 عصر
آپلود کردم
میتونی از
اینجا (
https://www.dropbox.com/s/3l6diojv5csk3a9/tinythread.rar) با حجم یادم نیست فقط یادمه که حجمش کمه
دانلود کنی.