PDA

View Full Version : سوال: انجام تنظیمات برای پذیرش آرایه های بزرگ مقیاس در VS C++ 2010



sibooy
یک شنبه 05 خرداد 1392, 14:04 عصر
سلام
من یک آرایه بزرگ دارم که باید حجمشون 380*380*96*94 باشه. این کار رو در ویژوال استودیو c++ انجام می دم. اما ایراد میگیره و میگه باید حجمش انقدر نباشه. من مجبورم آرایه رو 94*48*190*190 تعریف کنم.
من به اندازه کافی هم ram دارم.
استادم میگه که ویژوال استودیو تنظیماتی داره که باید عوض بشه تا بتونه این آرایه ها رو هم قبول کنه.
کسی هست که بدونه چه تنظیماتی هست؟
من از ویژوال استودیو 2010 c++ استفاده می کنم.
تروخدا کمکم کنید

UfnCod3r
یک شنبه 05 خرداد 1392, 14:55 عصر
فکر کنم این باشه
project properties\c,c++\linker\system\enable large address

می تونی عوض این کارا از heap استفاده کنی

sibooy
یک شنبه 05 خرداد 1392, 18:36 عصر
فکر کنم این باشه
project properties\c,c++\linker\system\enable large address

می تونی عوض این کارا از heap استفاده کنی
سلام دوست عزیز چطور میشه از heap استفاده کرد؟
کاری رو که گفتید انجام دادم نشد

UfnCod3r
یک شنبه 05 خرداد 1392, 22:30 عصر
این طوری دیگه

int* array = (int*)malloc(sizeof(int)*4194304);

sibooy
دوشنبه 06 خرداد 1392, 13:42 عصر
این طوری دیگه

int* array = (int*)malloc(sizeof(int)*4194304);

این کار رو هم کردم ولی نمی شه. اصلا اجرا نمی کنه. راه دیگه ای به نظرتون نمیرسه؟

darknes666
دوشنبه 06 خرداد 1392, 13:53 عصر
اینو امتحان کن


int *pValue = new int; // pValue is assigned 4 bytes from the heap
int *pArray = new int[10]; // pArray is assigned 40 bytes from the heap



مثلا
int *myarray=new int[65600];


اگر عدد مورد نظرت خیلی بزگ هست نمیشه از این استفاده کرد.باید بیای تقسیم بندی کنی یا بری سراغ اسمبلی غیر اینها به نظر من راه حلی وجود نداره.

manij_mhm
دوشنبه 06 خرداد 1392, 15:01 عصر
شما این تنظیمات رو به پروژه مورد نظرتون اضافه کنید


<configuration>
<runtime>
<gcAllowVeryLargeObjects enabled="true" />
</runtime>
</configuration>

darknes666
دوشنبه 06 خرداد 1392, 15:14 عصر
کلا روش همونی هست که من گفتم.نه تنها من بلکه خود مایکروسافت میگه از heap استفاده کنین.ربطی به کامپایلر و یا تنظیمات نداره.بحث یک چیز سخت افزاری هست.

میتونین اینجا رو هم نگاه کنی.


http://social.msdn.microsoft.com/Forums/en-US/vcgeneral/thread/724e0694-e070-440c-811f-013b15a61b64

manij_mhm
دوشنبه 06 خرداد 1392, 15:18 عصر
البته برای توضیح بیشتر باید بگم CLR در سیستم های 32 بیتی شی ایی با اندازه بیشتر از 2GB رو ساپورت نمی کنه . اما درسیستم های 46 بیتی این امکان وجود داره. گرچه به صورت پیش فرض همون 2 گیگ رو پشتیبانی می کنه. بنابراین شما با اعمال تغییرات فوق برای سیستم های 64 بیتی می تونید شی ای با اندازه بیشتر از 2GB ایجاد نمایید.

darknes666
دوشنبه 06 خرداد 1392, 15:46 عصر
بهترین راه حل اسمبلی هست.دوست عزیز چرا از اسمبلی استفاده نمیکنی؟

تو اسمبلی شما تمام و کمال رم رو در اختیار داری و میتونی قست بزرگی از اون رو دستکاری کنی و اطلاعات و داده ها رو تو اونا ذخیره کنی.ولی باید بیشتر کد نویسی کنی و زحمت به خرج بدی.تو ابر رایانه ها هم از اسمبلی استفاده می کنن.چرا که کامپیوتر درکی از اعداد بزرگ مثل ده میلیارد نداره.من فکر کنم چاره ای جز این نداشته باشین.

saied_hacker
دوشنبه 06 خرداد 1392, 16:36 عصر
البته برای توضیح بیشتر باید بگم CLR در سیستم های 32 بیتی شی ایی با اندازه بیشتر از 2GB رو ساپورت نمی کنه . اما درسیستم های 46 بیتی این امکان وجود داره. گرچه به صورت پیش فرض همون 2 گیگ رو پشتیبانی می کنه. بنابراین شما با اعمال تغییرات فوق برای سیستم های 64 بیتی می تونید شی ای با اندازه بیشتر از 2GB ایجاد نمایید.

اینجا بخش Native هست و این دوستمونم میخاد از Native C++ استفاده کنه چه ربطی به CLR داره.... !؟


بهترین راه حل اسمبلی هست.دوست عزیز چرا از اسمبلی استفاده نمیکنی؟

تو اسمبلی شما تمام و کمال رم رو در اختیار داری و میتونی قست بزرگی از اون رو دستکاری کنی و اطلاعات و داده ها رو تو اونا ذخیره کنی.ولی باید بیشتر کد نویسی کنی و زحمت به خرج بدی.تو ابر رایانه ها هم از اسمبلی استفاده می کنن.چرا که کامپیوتر درکی از اعداد بزرگ مثل ده میلیارد نداره.من فکر کنم چاره ای جز این نداشته باشین.

چرا اسمبلی این که راحت جواب داد

main()
{
int* p = (int*)malloc(sizeof(int) * 1303065600);
//int* s = p;

p[1303065600] = 100;
p[0] = 200;
printf("%d%s", p[0], "\n");
printf("%d%s", p[1303065600], "\n");
printf("%d%s", p[1303065599], "\n");
}

UfnCod3r
دوشنبه 06 خرداد 1392, 16:54 عصر
اسمبل و CLR چ ربطی داره
با ی new یا malloc ساده کار تمومه من نمی دونم چرا ایشون حی می گن نمیشه


این کار رو هم کردم ولی نمی شه. اصلا اجرا نمی کنه. راه دیگه ای به نظرتون نمیرسه؟

اجرا منظورت چیه
کامپایل
موقع دیباگ خطا میده
خطا چیه و ..
کامل بگو

darknes666
دوشنبه 06 خرداد 1392, 17:09 عصر
اخه کدوم ادمی میاد سرعت رو اینجوری با سی بیاره پایین؟برای محاسبات نیاز به سرعت هست که به نظر من اسمبلی بهترین گزینه هست و این کاری که شما می کنین عملا یعنی کم کردن سرعت کامپیوتر.

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

اینجا هم جواب میده؟
بله ولی سرعت خیلی پایین میاد.

ولی تو اسمبلی شما اصلا افت سرعت ندارین.

darknes666
دوشنبه 06 خرداد 1392, 18:06 عصر
خب این کد هم کار میکنه.


#include<iostream.h>
#include<conio.h>
main()
{
int x;
asm{
mov ax,1
mov [4000000000],ax
mov bx,[4000000000]
mov x,bx
}
cout<<x<<endl;
getch();
}

darknes666
دوشنبه 06 خرداد 1392, 18:44 عصر
یک راه دیگه هم پیدا کردم.


char * memoryBlock;
memoryBlock = new char[size];



memoryBlock درواقع همون اسم هست.بقیه هم که مشخصه.

FastCode
دوشنبه 06 خرداد 1392, 19:02 عصر
خب این کد هم کار میکنه.


#include<iostream.h>
#include<conio.h>
main()
{
int x;
asm{
mov ax,1
mov [4000000000],ax
mov bx,[4000000000]
mov x,bx
}
cout<<x<<endl;
getch();
}
حتی اسمبلی هم بلد نیستید.
1.ax رو ریختی توی integer
۲.کجا allocate کردین؟


علت اینکه میگه نمیتونه allocate کنه اینه که عددتون خیلی بزرگه
از این استفاده کنید:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa366887%28v=vs.85%29.aspx
دقت کنید:
SIZE_T dwSize
راجع به MEM_PHYSICAL و MEM_LARGE_PAGES هم بخونید

manij_mhm
دوشنبه 06 خرداد 1392, 19:26 عصر
نمی دونم چرا موقع جواب دادن به سوالات حتما باید اطلاعاتتون رو به رخ هم بکشید؟!!!
گمونم برای هر مساله ای فقط یه جواب موجود نباشه! هرکسی سبک کد نویسی خودشو داره!
اون تنظیماتی هم گفتم قبلا مشکل خودم بوده البته واسه زبان c# با تنظیمات بالا مشکل من حل شد! اینجا گذاشتم دوستون هم مشکلش حل شه!
توضیحات هم مربوط به msdn.microsoft بود.

FastCode
دوشنبه 06 خرداد 1392, 21:32 عصر
push qword 100000000
call malloc
add rsp, 8

این هم ۱۱۰۰۰ خط

کلا میدونی Access Violation و Virtual Memory و TLB و page و page table و heap و اینا چیه؟
دلیل نمیشه چون یک بار اجرا شده دوباره اجرا بشه.

FastCode
دوشنبه 06 خرداد 1392, 21:45 عصر
1.نیازی به stack نیست.مثلا inline assembly ه
2.data ای استفاده نکردم که تعریف کنم.
3.nasm
4.کد من ۶۴ بیت ه.۱۰۰٪ توی emu8086 خطا میده.

اون کدی که تغییر دادم هم کامپایل میشه ولی چون قسمت error check جز بحث نبود حذفش کردم.

Negative_Se7en
سه شنبه 07 خرداد 1392, 13:17 عصر
دوست عزیز ،__UFNHGGI_H__ و saied_hacker جواب سوالتونو همون اول تاپیک دادن .
شما فقط میگی نمیشه ، ولی نمیگی چرا که بقیه راحت کمکت کنن.


بهترین راه حل اسمبلی هست.دوست عزیز چرا از اسمبلی استفاده نمیکنی؟

تو اسمبلی شما تمام و کمال رم رو در اختیار داری و میتونی قست بزرگی از اون رو دستکاری کنی و اطلاعات و داده ها رو تو اونا ذخیره کنی.ولی باید بیشتر کد نویسی کنی و زحمت به خرج بدی.تو ابر رایانه ها هم از اسمبلی استفاده می کن.
چرا ؟ هیچ ارتباطی به اسمبلی نداره ! مگه شما توی Kernel Mode داری کد مینویسی که تمام و کمال رم رو در اختیار داری ؟ شما تو User Mode با Virtual Memory کار داری . کلا شما از سیستم عامل میخوای که حافظه ی مورد نظر رو برات Allocate کنه و توسط API سیستم عامل این درخواست رو ازش میکنی .
این دیگه چه ربطی به اسمبلی داره ؟
اگه Allocate با اشکال روبرو میشه یا داخل Virtual Memory Space فضایی نیست یا داخل Physical Memory یا مشکل دیگه ای هست چه ربطی داره به اسمبلی ؟


چرا که کامپیوتر درکی از اعداد بزرگ مثل ده میلیارد نداره
چی میگی ؟ با 32 بیت نمیشه این عدد رو پوشش داد ولی این ربطی به کامپیوتر نداره . شما با 64 بیت یا 128 بیت میتونی این عدد رو پوشش بدی.


اخه کدوم ادمی میاد سرعت رو اینجوری با سی بیاره پایین؟برای محاسبات نیاز به سرعت هست که به نظر من اسمبلی بهترین گزینه هست و این کاری که شما می کنین عملا یعنی کم کردن سرعت کامپیوتر.

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

اینجا هم جواب میده؟
بله ولی سرعت خیلی پایین میاد.

اولی تو اسمبلی شما اصلا افت سرعت ندارین
آقا یکم فکر کن چی میگی .
شما با این عدد (86000000000000000000000000000) چی کار میکنی ؟ نکنه میتونی تو رم همیچین Block ی اختصاص بدید ؟

کد اسمبلیت هم اشتباهه ! همینطوری اومدی یه آدرس از Virtual Memory رو آدرس دادی بعد مقدارشم تغییر دادی ! نه Allocation ی نه چیزی !

برادر انقدر الکی رو اشتباهی که میکنی پافشاری نکن ! چرا اینقد کل کل میکنی ؟

Negative_Se7en
سه شنبه 07 خرداد 1392, 22:33 عصر
با کدی که من نوشتم میشه از خونه های رم استفاده کرد.راستی هدفم هم Allocation کردن نبود چون نه تنها من کل بچه های تاپیک هم نمیتونن Allocation رو فقط و به طور خالص با اسمبلی بنویسن.حالا هی بیاین بگین Allocation نکردی.مگه فقط باید Allocation کرد ؟میشه با 10000راه یک برنامه رو نوشت.
درضمن من نگفتم به اسمبلی ربط داره یکم فک کن ببین چی داری میخونی.گفتم چرا از اسمبلی استفاده نمیکنی؟(حالا هیییییی بیا بگو چه ربطی به اسمبلی داره)

کسی که سوال پرسیده (در واقع هدف تاپیک ) در مورد Memory Allocation هست . پس اگه هدفت از Allocation کردن نبود پس کلا پست هات Off-Topic بود .
اگه بحث خاصی داری که میخوای در بارش بحث کنی یه تاپیک درست کن تا تاپیک های دیگه منحرف نشه.
از کجا انقدر مطمءنی که کسی نمیتونه یه Allocator پیاده سازی کنه ؟
بله "باید" کلا هر برنامه ای از Memory Allocation استفاده میکنه ! چه این Allocation از Stack باشه چه از Heap چه از ... شما بدونه Allocation بنویس تا اسمت تو کتاب گینس نوشته بشه .
شما داری مشکل رو میزنی رو حساب زبان C و میگی از Assembly استفاده کن در صورتی که مشکل از جای دیگه ای هست .


در ضمن قرار نیست تو حالت kernel باشه مگه بیماریم.منظور من از کامل اینه که میشه برنامه رو نوشت.وگر نه برای کرنال یه عالمه باید مطالعه کرد تا سیستم از protect mode در بیاد.اینو خودم تو زمان هک بازی ها متوجه شدم که نمیشه مقداری که مثلا تو 0x7899ea هست رو پیدا کرد
هرچی فک میکنم نمیدونم چه ربطی داره !
بیخیال آقا ;)

FastCode
چهارشنبه 08 خرداد 1392, 12:46 عصر
احتمالا هیچ وقت نیاز ندارم deep blue رو درک کنم چون هیچوقت ازش استفاده نمیکنم.
ولی چون نیاز دارم gc ه .net رو درک کنم مشابهش رو نوشتم که مطمئن بشم میفهمم چطور کار میکنه.
من نیاز ندارم این چیزها رو به شما توضیح بدم.لطفا off-topic پست ندید.

@sibooy:
VirtualAlloc/VirtualFree جواب داد؟
در سیستم های (posix(linux/unix باید از mmap64/munmap64 استفاه کنید.

darknes666
چهارشنبه 08 خرداد 1392, 13:16 عصر
اگر میدونستی برنامه ی اسمبلیت مشکل نداشت.و فایل exe رو میزاشتی اینجا.

FastCode
چهارشنبه 08 خرداد 1392, 14:29 عصر
1.من فقط میتونم elf بزارم اینجا(آواتارم رو ببین)
2.کد من ۶۴ بیته.منم وقتی ۱۵ سالم بود ۱۶ بیت مینوشتم.

darknes666
چهارشنبه 08 خرداد 1392, 14:40 عصر
اگر میشه با 64 بیت نوشت 100% هم میشه با 16بیت نوشت ولی طولانی تر میشه.چون نمیشه از ماکروهای از پیش نوشته استفاده کرد.

FastCode
چهارشنبه 08 خرداد 1392, 14:50 عصر
اگر میشه با 64 بیت نوشت 100% هم میشه با 16بیت نوشت ولی طولانی تر میشه.چون نمیشه از ماکروهای از پیش نوشته استفاده کرد.
380*380*96*94 *4 bytes per item
5212262400B
چطوری میخواهی با سیستم ۱۶ بیتی با این مقدار حافظه کار کنی؟ Memory Mapped File؟
در ضمن اون کد ۳ خطی که اول گزاشتم رو با GCC کامپایل کردم شد ۱۷۰ خط که ۸۰ خطش مفید بود.
وقتی راه حل بهتر هست لازم نیست کار رو سخت انجام بدید حتی اگر سرعتش بیشتر باشه(که نیست)

darknes666
چهارشنبه 08 خرداد 1392, 14:54 عصر
نه با سیستم 16 بیتی با اسمبلی که رجیستر هاش 16 بیتی هست میگم.

FastCode
چهارشنبه 08 خرداد 1392, 16:18 عصر
نه با سیستم 16 بیتی با اسمبلی که رجیستر هاش 16 بیتی هست میگم.
باز هم نمیتونید آدرس بدید.
challenge ه تعداد بیت نیست.میخواهیم بیش از ۴ گیگ حافظه allocate کنیم ترجیحا با C++.
واقعا که نمیخواهی برای رسیدن به 1234567890 شصت هزار بار RAX رو با cx جمع کنی؟

darknes666
چهارشنبه 08 خرداد 1392, 16:28 عصر
خب میشه ماکرو های خود نویس نوشت کار رو اسون تر میکنه.میشه بیشتر از 4گیگ هم allocate کرد ولی برای رزرو بیشتر از 4gig میرن تو kernel mode

sibooy
چهارشنبه 08 خرداد 1392, 18:16 عصر
اسمبل و CLR چ ربطی داره
با ی new یا malloc ساده کار تمومه من نمی دونم چرا ایشون حی می گن نمیشه

اجرا منظورت چیه
کامپایل
موقع دیباگ خطا میده
خطا چیه و ..
کامل بگو

سلام به همه دوستان
خدا رو شکر از محبت همه تون سپاسگزارم.
با heap اجرا نمی کنه. یعنی وقتی دکمه اجرا رو می زنم خطا نمیگیره در سکوت کامل اجرا هم نمی کنه. بذارید ببینم هرچی پیغام داشته باشه براتون می نویسم.
درضمن مسئله اینه که من باید برنامه رو روی cuda هم اجرا کنم نمی تونم یه اجرا رو ببرم توی اسمبلی یه اجرا رو بذارم توی C++‎ باشه که.
اینم بگم که ویندوزم 64 بیتی هست و هشت گیگ هم رم دارم.

sibooy
چهارشنبه 08 خرداد 1392, 18:36 عصر
میشه انقدر بحث بیخودی نکنین دوستان. بذارید من اصل قضیه رو بگم.
من دارم روی یه الگوریتم ستاره شناسی کار می کنم. یه فضای خاصی رو باید پردازش کنه. یه بازه خاصی هست با مختصات x و y و z خب؟
من باید اینو بصورت موازی برنامه نویسی کنم که خدا رو شکر کردم. اما به خاطر همین خطای زیر
fatal error LNK1248: image size (994EB000) exceeds maximum allowable size (80000000)
مجبور شدم فضای محاسباتم رو از هر بُعد به نصف کاهش بدم.
گرفتین؟ من حدود 95 تا آرایه 96*380*380 دارم که باید محاسبه کنم اما همون خطای بالا مانع میشه. ابعاد آرایه رو کردم 46*190*190
آرایه هام هم همه از نوع دابل هستن.
لطفا بدون اینکه خون خودتونو کثیف کنید و عین خروس جنگی بهم بپرید لطفا بگید چی کار کنم؟
اون تنظیمات اول جواب نداد. heap جواب نمی ده. از اسمبلی هم نمیتونم استفاده کنم. شاید تنظیمات دیگه ای داره بگید.
اون قطعه کد رو هم اجرا می کنم ببینم چی میشه.
ممنون فقط لطفا دعوا نکنید.

saied_hacker
چهارشنبه 08 خرداد 1392, 18:40 عصر
من حدود 95 تا آرایه 96*380*380 دارم که باید محاسبه کنم اما همون خطای بالا مانع میشه. ابعاد آرایه رو کردم 46*190*190
آرایه هام هم همه از نوع دابل هستن.


کدت رو بزار ببینیم چطور تعریف کردی ...

مصطفی ساتکی
چهارشنبه 08 خرداد 1392, 19:06 عصر
سلام
من یک آرایه بزرگ دارم که باید حجمشون 380*380*96*94 باشه. این کار رو در ویژوال استودیو C++‎‎‎ انجام می دم. اما ایراد میگیره و میگه باید حجمش انقدر نباشه. من مجبورم آرایه رو 94*48*190*190 تعریف کنم.
من به اندازه کافی هم ram دارم.
استادم میگه که ویژوال استودیو تنظیماتی داره که باید عوض بشه تا بتونه این آرایه ها رو هم قبول کنه.
کسی هست که بدونه چه تنظیماتی هست؟
من از ویژوال استودیو 2010 C++‎‎‎ استفاده می کنم.
تروخدا کمکم کنید
وقتی شما malloc می کنید سیستم عامل فضایی را که در اختیار شما قرار میده به صورت پیوسته هستش و اگر memory fragment باعث بشه اون فضا به صورت پیوسته وجود نداشته باشه malloc مقدار صفر بر می گردونه بهترین راه حل این هستش که به صورت بلوک های کوچک تر malloc کنید مثلاً 100mg برای هر بلوک و سپس خودتون مدیریت کنید تو سیستم های HPC هم اغلب از این تکنیک استفاده میشه.

sibooy
چهارشنبه 08 خرداد 1392, 19:13 عصر
ببینید این کاملا درست اجرا می شه

#define DATAXSIZE 190
#define DATAYSIZE 190
#define DATAZSIZE 96
#define DATASIZE 66

const int nx = DATAXSIZE;
const int ny = DATAYSIZE;
const int nz = DATAZSIZE;
const int nl = DATASIZE;


if ((vv = (MATRIX *)malloc((nl*nx*ny*nz)*sizeof(float))) == 0) {fprintf(stderr,"malloc1 Fail \n"); return 1;}




اما این اجرا نمی شه

#define DATAXSIZE 380
#define DATAYSIZE 380
#define DATAZSIZE 48
#define DATASIZE 66

const int nx = DATAXSIZE;
const int ny = DATAYSIZE;
const int nz = DATAZSIZE;
const int nl = DATASIZE;


if ((vv = (MATRIX *)malloc((nl*nx*ny*nz)*sizeof(float))) == 0) {fprintf(stderr,"malloc1 Fail \n"); return 1;}




همونطور که گفتم پیغام خطا هم نمیده
این همه پیغاماییه که موقع اجرای آرایه های 380 میده
'cu3.exe': Loaded 'C:\ProgramData\NVIDIA Corporation\NVIDIA GPU Computing SDK 4.2\C\src\cu3 - Copy\Release\cu3.exe', Symbols loaded.
'cu3.exe': Loaded 'C:\Windows\SysWOW64\ntdll.dll', Cannot find or open the PDB file
'cu3.exe': Loaded 'C:\Windows\SysWOW64\kernel32.dll', Cannot find or open the PDB file
'cu3.exe': Loaded 'C:\Windows\SysWOW64\KernelBase.dll', Cannot find or open the PDB file
'cu3.exe': Loaded 'C:\Program Files\NVIDIA GPU Computing Toolkit\CUDA\v4.2\bin\cudart32_42_9.dll', Binary was not built with debug information.
'cu3.exe': Loaded 'C:\Windows\SysWOW64\msvcr100.dll', Cannot find or open the PDB file
The program '[1632] cu3.exe: Native' has exited with code 1 (0x1).

و دیگر هیچ
من باید برای استفاده از cuda از heap استفاده می کردم
ممنون می شم راهنمایی اگه دارین بدون دعوا مرافعه بفرمایید

FastCode
چهارشنبه 08 خرداد 1392, 19:14 عصر
image size؟
چرا آرایه رو static تعریف کردین؟
باید موقعی که نیاز دارید این مقدار رو malloc/new کنید.
در ضمن روشتون ۱۰۰٪ غلطه.
برای این جور کارها از ماتریسهای sparse و finger-tree و B* Tree و radix-sort و radix-index و consistent-hashing و این جور الگوریتم ها استفاده میشه که با توجه به اینکه از array استفاده کردید میشه شرط بست که از هیچ کدوم از اینها استفاده نکردید.که باعث کاهش شدید کارایی برنامتون میشه.با این مقدار رم میشه کارهای خیلی بزرگتری انجام داد.
اگر هم حجم محاسباتتون خیلی بالاست و فکر میکنید array از این روشها به صرفه تر هست(معمولا از هیچ جهتی نیست) پیشنهاد میکنم برای این نوع پردازش ها حتما یک سری به OpenCL و CUDA بزنید

sibooy
چهارشنبه 08 خرداد 1392, 19:26 عصر
با اینم نشد
ببینید محاسبات مبروط به ستاره شناسی هست. درخت و اسپارس و . . . نه. من آرایه می خوام
بدون const هم نمی شه

int nx = 380;
int ny = 380;
int nz = 96;
int nl = 66;

مصطفی ساتکی
چهارشنبه 08 خرداد 1392, 19:29 عصر
مثل اینکه ما هرچی می گیم شما حرف خودتونو می زنید و اصلاً هم به موارد گفته شده توجه نمی کنید شما اگر میخاید با cuda پروسس کنید می دونید نرخ انتقال از host به device چقدر زیاد میشه .

UfnCod3r
چهارشنبه 08 خرداد 1392, 19:34 عصر
کد رو بزار
اون خطا واس اینه ک حالت استاتیک حافظه گرفتی و حجمش زیاد هست
96*380*380 تا دابل میشه 110 مگ . خیلی خیلی زیاده
بیشتر از 16 مگ نگیری بهتره چون تا هردفعه ک برنامه رو اجرا می کنی ممکنه اون قدر فضای خالی پیدا نشه .
می تونی از چند تا ارایه استفاده کنی عوض اینکه یهو کلی فضا بگیری
اینطوری

#define HEAPSIZE 256000
#define ALLOCKCOUNT 8192

double* arr[ALLOCKCOUNT];
for(int i = 0; i < ALLOCKCOUNT; i++)
arr[i] = new double[HEAPSIZE];

double GetItem(int index)
{
return arr[index/HEAPSIZE][index % HEAPSIZE];
}


double a = GetItem(1231231);

FastCode
چهارشنبه 08 خرداد 1392, 19:36 عصر
ممکنه بیشتر کد بزارید؟
کپی HostToDevice و ساختار ماتریکس و کرنل و اینها رو هم اگر یک مقدار توضیح بدید بد نیست.چون فکر میکنم Device تون حافظه کافی نداره.(راه حل داره)

Note:برای CUDA پیشنهاد میکنم حتما از NSight استفاده کنید.واقعا امکانات خوبی داره(یکیش تشخیص همین مورد حافظه کم)(من ازش راضیم)

sibooy
چهارشنبه 08 خرداد 1392, 19:43 عصر
مثل اینکه ما هرچی می گیم شما حرف خودتونو می زنید و اصلاً هم به موارد گفته شده توجه نمی کنید شما اگر میخاید با cuda پروسس کنید می دونید نرخ انتقال از host به device چقدر زیاد میشه .

با cuda نوشتم. انقدر حجم محاسبات سنگین هست که با وجود زمان نیاز به انتقال از حافظ ها، برنامه من speedup ی حدود هفتاد برابر داره.
و اگر بتونم اندازه اصلی محاسبات رو به کار ببرم خیلی خیلی speedup قوی خواهم داشت.
مثلا همین محاسبات روی فضای دوبعدی چون حجم محاسبات کم می شه زمان انتقال از حافظه ها حسابی خودشو نشون می ده. ولی توی سه بعدی اساسی می ارزه

من هشت گیگ رم دارم بابا می خوام تا جایی که ممکنه فضای محاسبات رو گسترش بدم. اصلا امکان داره؟

مصطفی ساتکی
چهارشنبه 08 خرداد 1392, 19:51 عصر
کرنل در واقع همون کد parallel هستش که تحت قالب یک function می نویسید که تو آن متغیر های intrinsic مربوط به گرید از جمله blockID و threadID هستش که شما با این ساختار می تونید به حافظه به صورت چند بعدی دسترسی داشته باشید.
ماهیت کار بایستی به صورت موازی باشه که طرف بخاد از gpu استفاده کنه به یک مثال بگم شما میخاید لیست از feature ها رو آموزش بدید و کلاسیفیر شما رو gpu هستش حالا اگر اندازه feature ها کوچک باشه این انتقال داده از سمت cpu یا host به سمت device یا gpu مقرون به صرفه نیست چون شما داده رو ram دارید حالا بایستی که بایستی هی cumalloc کنید و هی cumemcpy همون طور هم خودتون می تونید هر جفتش زمان گیره بجز اینکه راهی پیدا کنید که داده ها را به صورت bulck انتقال بدید و سمت gpu پروسس کنید که باز هم به طبیعت مسئله بستگی داره.

UfnCod3r
چهارشنبه 08 خرداد 1392, 19:55 عصر
خب تیکه تیکه بگیر دیگه این انداره ک شما می خوای نمیشه گرفت
اون کدی ک دادمو نکا کن ببین بدرت می خوره یا نه :عصبانی++:

sibooy
چهارشنبه 08 خرداد 1392, 20:03 عصر
کد رو بزار
اون خطا واس اینه ک حالت استاتیک حافظه گرفتی و حجمش زیاد هست
96*380*380 تا دابل میشه 110 مگ . خیلی خیلی زیاده
بیشتر از 16 مگ نگیری بهتره چون تا هردفعه ک برنامه رو اجرا می کنی ممکنه اون قدر فضای خالی پیدا نشه .
می تونی از چند تا ارایه استفاده کنی عوض اینکه یهو کلی فضا بگیری
اینطوری

#define HEAPSIZE 256000
#define ALLOCKCOUNT 8192

double* arr[ALLOCKCOUNT];
for(int i = 0; i < ALLOCKCOUNT; i++)
arr[i] = new double[HEAPSIZE];

double GetItem(int index)
{
return arr[index/HEAPSIZE][index % HEAPSIZE];
}


double a = GetItem(1231231);


دوست عزیز یه خورده درمورد کدتون توضیح میدین؟
اون فضایی رو که من می خوام در دسترس قرار میده؟
من 66 تا مشتق جزیی دارم که هرکدوم آرایه 380*380*96 میخواد
الان کدتون همچین فضایی برای من درست می کنه؟

sibooy
چهارشنبه 08 خرداد 1392, 20:06 عصر
خب تیکه تیکه بگیر دیگه این انداره ک شما می خوای نمیشه گرفت
اون کدی ک دادمو نکا کن ببین بدرت می خوره یا نه :عصبانی++:

دوست عزیز یه خورده درمورد کدتون توضیح میدین؟
اون فضایی رو که من می خوام در دسترس قرار میده؟
من 66 تا مشتق جزیی دارم که هرکدوم آرایه 380*380*96 میخواد
الان کدتون همچین فضایی برای من درست می کنه؟
عصبانی نباشید تروخدا.
اساتید دانشگاهم اگر بخوان انقدر زود داغ کنن که فاتحه هرچی دانشجو خونده س.
حالا بگذریم از ستاره شناسا که سال ها روی یه موضوعی هی تحقیق می کنن:متعجب:
اندکی صبر سحر نزدیک است:لبخندساده:

FastCode
چهارشنبه 08 خرداد 1392, 20:55 عصر
یافتم

const int nx = DATAXSIZE;توی پست اولم هم گفتم که از size_t استفاده کنید.
در ضمن بهتره از malloc استفاده نکنید چون فقط سرعتتون رو میاره پایین.

UfnCod3r
چهارشنبه 08 خرداد 1392, 21:13 عصر
اره
اینطوری هر چقدر ک می خوای میشه
الان من تو این کد 380 تا جدا جدا حافظه گرفتم ک هر کدوم 36480 تا دابل هست .
فقط کافیه از این دو تا تابع برا مقدار دهی و مقدار دادن استفاده کنی همین .

#define HEAPSIZE (380*96)
#define ALLOCKCOUNT 380

double* arr[ALLOCKCOUNT];
for(int i = 0; i < ALLOCKCOUNT; i++)
arr[i] = new double[HEAPSIZE];

double GetVal(int index)
{
return arr[index/HEAPSIZE][index % HEAPSIZE];
}
void SetVal(int index, double val)
{
arr[index/HEAPSIZE][index % HEAPSIZE] = val;
}

FastCode
چهارشنبه 08 خرداد 1392, 21:33 عصر
اره
اینطوری هر چقدر ک می خوای میشه
الان من تو این کد 380 تا جدا جدا حافظه گرفتم ک هر کدوم 36480 تا دابل هست .
فقط کافیه از این دو تا تابع برا مقدار دهی و مقدار دادن استفاده کنی همین .

#define HEAPSIZE (380*96)
#define ALLOCKCOUNT 380

double* arr[ALLOCKCOUNT];
for(int i = 0; i < ALLOCKCOUNT; i++)
arr[i] = new double[HEAPSIZE];

double GetVal(int index)
{
return arr[index/HEAPSIZE][index % HEAPSIZE];
}
void SetVal(int index, double val)
{
arr[index/HEAPSIZE][index % HEAPSIZE] = val;
}


این کار غیر ممکنه.
به این دلیل:

CUDA_CHECK_RETURN(cudaMalloc((void**) &devBuffer, BUFFER_SIZE))
CUDA_CHECK_RETURN(
cudaMemcpy(devBuffer, hostBuffer, BUFFER_SIZE, cudaMemcpyHostToDevice));