Saturday, December 10, 2016

КУДА Фортран ба Зэрэгцээ тооцооллын код бичих нь /CUDA Fortran and Parallel coding/

КУДА ФОРТРАН ашиглан зэрэгцээ тооцоолол үйлдэх код бичих нь

ХУРД, ХҮЧ эдгээр нь юмсыг гэрэлтүүлэх, цойлуулах гайхалтай чанарууд юм. Хурд хүчний гайхамшиг болсон төмөр хүлэг, хурд хүчийг гайхуулсан залуу нас гэх мэт. Гүйцэтгэлийг улам гоё болгож харагдуулах, чанаржуулах увидас энэхүү хурд хүчинд буй. 
Зэрэгцээ тооцооллоор үйлдэх боломжтой тооцооллууд

Хүмүүн аливаа ажлыг хийж чаддаг боловч хурдыг нэмж чадах эсэх нь тухайн хүмүүний бас нэгэн чадварыг шалгана. Хурд хүчний гайхамшиг зөвхөн биед бус оюун ухаанд мөн агуулагдана. Хүмүүний үргэлж эрэлхийлдэг энэхүү чанар тооцон бодох шингэний динамикт зэрэгцээ тооцооллоор биелэлээ олох юм. Зэрэгцээ тооцооллыг үйлдэх кодыг боловсруулахад бидний оюун ухааны хурд хүчний гайхамшиг мөн шингэх учиртай.
Хамгийн бага хугацаанд хамгийн их үйлдлийг хамгийн том хэмжээстэд үйлдэх боломжийг зэрэгцээ тооцоолол олгох юм.



Яагаад бид зэрэгцээ тооцоолол хийх хэрэгтэй вэ?
Энгийн ширээний компьютер болон зөөврийн компьютер нь процессорын хүчин чадлаас хамаарч хязгаарлагдмал тооцоолол үйлдэх боломжтой. Нөгөө талаас тооцон бодох алгоритмын үр ашигаас хамаарч тооцооллыг удаан хугацаанд хийх тохиолдол гарна. Эсвэл угаас удаан хугацааны, эсвэл том орон зайн дахь үзэгдлийг тооцон бодох шаардлага гарвал энгийн тооцон бодох хэрэгсэл хүчин мөхөсдөх болно. Үүн дээр нэмэгдээд тооцооллын зарим нэг шаардлагууд бий. Тухайлбал, бодит хугацааны тооцоолол, бодит хугацааны симуляци гэх мэт. Тооцоолол үйлдэж байхад эхний оролдлогоор тооцооллыг амжилттай гүйцэтгэж үр дүнг яг таг гарган авна гэж байдаггүй. Тооцоолол эхэлсэн бол дахин дахин туршиж, зарим тогтмолыг өөрчилж тестүүдийг олон хийнэ. Энэ үед мөн тооцооллоо хурдан шуурхай гүйцэтгэвэл цаг хугацаа хичнээн ихийг хэмнэх нь ойлгомжтой. 

Ямар тохиолдолд зэрэгцээ тооцоолол хэрэгтэй вэ?
Ихэвлчэн тооцон бодох шинжлэх ухаанд зэрэгцээ тооцооллыг хийнэ. Үүнд астрономи, гариг эрхэсийн хөдөлгөөн, мөргөлдөөн, татах хүчний долгион гэх мэт сансар огторгуйн тооцооллоос гадна манай дэлхий дээрх уур амьсгалын тооцоолол, далайн циркуляци, усны сав газрын гидрологийн загварчлал, гидравликийн загварчлал, гол мөрөн далайн хагшаасны хөдөлгөөн, далайн эрэг ёроолын хувьсал өөрчлөгдөлт, тектоник хөдөлгөөн гээд л удаан хугацааны физик хими механикийн үзэгдлүүдийг тооцон бодоход зэрэгцээ тооцоолол хамгаас чухал. Усны барилгын тооцоо судалгаанд мөн чухал шаардлагатай. Тухайлбал усан сангийн төсөл хийх, хагшаасны хөдөлгөөнийг тогтоох, гол нуурын термодинамик, гидродинамик, боомтын эвдрэл заврал, үер усны аюул, үерийн хамгаалалтын барилгын загвар, ус хангамжийн систем, усжуулалтын систем, цэвэрлэх байгууламжийн гидравлик судалгаа гэх мэт. Макро, мезо, микро бүх түвшинд зэрэгцээ тооцооллын хэрэгцээ байсаар л байна. 

Яаж зэрэгцээ тооцооллыг хийх вэ?
Зэрэгцээ тооцооллыг үйлдэх хэд хэдэн боломж бий. Хамгийн эхнийх нь Message Passing Interface (MPI) буюу мэдээлэл солилцох харилцар (interface гэдгийг зүгээр л ингэж нэрлэмээр санагдлаа.) хэмээх технологи байгаа юм. Энэ технологиор ижил шиж чанартай процессоруудыг сүлжээгээр холбон толгой компьютерээр удирдах боломжийг хангана. Толгой ком дээр бичигдсэн параллел кодийн дагуу бусад процессоруудад ажлууд хуваагдан очиж сүлжээгээр нэг нэгэндээ мэдээллээ солилцож тооцооллыг үйлдэх болно. Мэдээлэл солилцох харилцар системд олон (Фортран, С, С++ бол найдвартай) програмчлалын хэл дээр параллел код бичих боломжтой. 
Үүний дараагийн боломжит арга нь OpenMP (open multi-processing) буюу олон үйлдэл боловсруулаx нээлттэй системийн арга юм. Энэ арга нь нэг эсвэл олон компьютер дээр төв боловсруулалтын нэгжийг (CPU) зэрэгцээлэх зарчмаар ажилладаг. Олон үйлдэл боловсруулах нээлттэй систем нь бараг л Фортан, С, С++ гэсэн гурван хэлд л боломжтой байх гэж бодож байна. Мэдээж маш олон үйлдлийн систем, бааз дээр боломжтой. Дээрх хоёр технологи нь түрүү үеийн бөгөөд маш сайн хөгжиж буй технологиуд юм. Зэрэгцээ код бичих дүрмүүд нь адилгүй бөгөөд үндсэн програмчлалын хэл дээр нэмэлт комманд бичиглэлүүд орж ирнэ. эдгээрээс өөр openACC гэх мэт аргууд бий. Гэхдээ нээх түгээмэл биш бөгөөд хэрэглэх цаг хүрээ нь хомс байж магадгүй. 
Хамгийн сүүлийн үеийн (2016 оны байдлаар юм шүү) технологи нь график боловсруулалтын нэгжийг (GPU) ашиглан зэрэгцээ тооцоолол үйлдэх технологи юм. Үүнийг бид График боловсруулалтын нэгж дээрх ерөнхий зорилтот тооцооллын технологи (General propose computing on the graphical processing units - GPGPU) гэж нэрлээд байгаа юм. Мөн л дээрх гурван аварга хэлүүд болох Фортран, С, С++ болон Пайтон /шинэ баатар/ хэлээр GPGPU зэрэгцээ тооцооллын код бичиж тооцоолол үйлдэх боломжтой байна. Зэрэгцээ кодыг график боловсруулах нэгжид зориулж бичих салбар хэлнүүдийг КУДА (CUDA-Compute Unified Device Architecture - Нэгдсэн төхөөрөмжийн архитектураар тооцоол) хэмээн овоглоно. Өөрөөр хэлбэл Куда Фортран (CUDA fortran), Куда С/С++ (CUDA C/C++), ПайКуда (PyCUDA) гэх мэт байна. Энэ нийтлэлийн гол зорилго бол КУДА Фортранаар код бичих тухай юмаа.



Зэрэгцээ кодыг КУДА Фортранаар бичих

КУДА Фортран хэл ба тооцооллын ерөнхий архитектур
Куда Фортран нь Фортран 90 хэлний өргөтгөл график боловсруулалтын нэгж дээр зэрэгцээ тооцооллын код бичихэд зориулсан хэл юм. Куда Фортраныг Куда С хэлнээс шууд хөрвүүлсэн мэтээр боловсруулсан ба зарим тохиолдолд Куда С хэлний сангуудаас ашигладаг. Фортран хэлний хөврүүлэгч нь лицензтэй тул нээлттэй эх үүсвэр гэж байхгүй. Зэрэгцээ кодны тухай ерөнхийд нь бичвэл хоёр төрлийн код нэг кодонд оршино. Эхний төрлийг нь эзэн код (host), нөгөөхийг нь төхөөрөмжийн код (device code) гэнэ. Угаас график боловсруулалтын нэгжийн бөөгнөрөл нь толгой гэгдэх серверээр удирдагдана. Энэ сервер нь төв боловсруулалтын нэгжтэй байж учир үүн дээр хөрвүүлэгдэж гүйцэтгэх кодны хэсгийг эзэн код гэж нэрлэж байгаа юм. Эзэн кодон дотор төхөөрөмжийн кодууд багтана. 
Куда Фортран хэлний кодны бүтэц, гүйцэтгэлийн ерөнхий архитектур
Төхөөрөмжийн код нь ихэвлэн цөм (kernels) хэлбэртэйгээр байна. Цөм гэдэг нь стандарт Фортран хэлний дэд програм (subroutines) юм. Фортран 77-оос хойших хэлнүүд бүгд хэрэглэх гэж буй хувьсагчийнхаа нэр болон багтаамжийг нь програм эхлэхэд зарлаж боловсруулах нэгж дээр захиалах ёстой байдаг. Иймд КУДА Фортран мөн ялгаагүй бүх хэрэглэгдэх хувьсагчуудыг яг зөв санах ойн дээр зориудаар зарлаж ашиглах санах ойн багтаамжийг захиална. Ерөнхийдөө КУДА Фортран кодны график процессорын нэгж дээр хийх үйлдлийг базаж хэлбэл:

  1. Эзэн код сервер дээр ачаалагдана. 
  2. Эзэн кодонд бүх хувьсагчууд хэрэглэгдэх санах ойн дээр зарлагдана. 
  3. Эзэн бодонд анхны нөхцөл утгууд өгөгдөнө. 
  4. Эзэн кодноос төхөөрөмжийн кодруу шаардлагатай өгөгдөлийг дамжуулна. 
  5. Эзэн кодноос төхөөрөмжийн код /цөм/ дээрх үйлдэлтэй хамт дуудагдана. 
  6. Төхөөрөмжийн код /цөм/ график боловсруулалтын нэгж дээр хуваагдсан хэсэг (blocks), тор (grids), бутархайгаар (threads) гүйцэтгэгдэнэ. 
  7. Цөмөөс тодорхойлогдсон утгууд эзэн кодруу шилжүүлэгдэнэ. 
  8. Эзэн кодноос тооцооллыг хянах ба тооцоолол дуустал дээрх үйлдлүүдийг (4-8 мөрийг давтана) хийнэ.
  9. Эцэст нь эзэн кодноос үр дүнг гаргаж өгнө. 

Дээрхээс харвал эзэн код ба цөм дээрх хэрэглэгдэх хувьсагчууд тодорхой санах ойн дээр зарлагдах ёстой гэсэн. Зөвхөн эзэн кодон дотор ашиглагдах хувьсагч тогтмолууд нь серверийн төв санах ойд хадгалагдахаар зарлагдана. Харин зөвхөн төхөөрөмжийн кодонд ашиглагдах хэмжигдэхүүн тогтмолуудыг төхөөрөмжийн санах ойн дээр хадгалагдахаар зарлана. Гэхдээ төхөөрөмж болон серверт янз бүрийн санах ой бий. Жишээ нь даяар санах ой (global memory), орчны санах ой (local memory) гэх мэт. Эдгээр санах ойн дээр тохируулан код бичих нь төвөгтэй байгаа учир нэгдсэн санах ой гэсэн технологийг НВИДИА /nvidia/ боловсруулж танилцуулсан гэсэн. Энэ тухай сайн мэдэхгүй ба мэдвэл нийтлэл орох болно. Дээрх архитектурын схемд харуулсан зураг нь Энтропитой сүлжээний Больцманы аргаар дугуй саад тойрч урсах урсгалыг тооцон бодох кодны бүтэц юм. Шууд энэ кодыг авч үзэх нь ерөнхий сурч байгаа хүмүүст ойлгомжгүй учир НВИДИА дээр тавигдсан Дан нарийвчлалт А-г үржих нь Х нэмэх нь У (ДАХНУ-SAXPY-Single precision A*X plus Y) хэмээх жишээг авч үзээд тайлбарлая. Эндээс кодны бүтэц, бичих аргагчлалыг сурна. Мөн өмнөх нийтлэлээс Сайнуу бутархайнуудаа (hello threads), Гурван векторыг (vector adding) нэмэх гэх мэт жишээн дээр ажиллах болох юм. 

КУДА Фортран хэлний үндэс
Энэ хэсгийг бид ДАХНУ жишээгээр авч үзнэ. Энэ жишээ нь зэрэгцээ кодны бараг жишиг бодлого болж байгаа юм шиг сайгаан. Цаашлаад жаахан сайжирчихвал Пи тоо олох жишээг тооцоолж болно. Бодлогийн ерөнхий томъёо нь:
z=ax+y
үүнд: x,y,z нь вектор, а нь скаляр хэмжигдэхүүн байна. 

Ингээд кодыг авч үзвэл:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
module mathOps
contains
  attributes(global) subroutine saxpy(x, y, a)
    implicit none
    real :: x(:), y(:)
    real, value :: a
    integer :: i, n
    n = size(x)
    i = blockDim%x * (blockIdx%x - 1) + threadIdx%x
    if (i <= n) y(i) = y(i) + a*x(i)
  end subroutine saxpy 
end module mathOps

program testSaxpy
  use mathOps
  use cudafor
  implicit none
  integer, parameter :: N = 40000
  real :: x(N), y(N), a
  real, device :: x_d(N), y_d(N)
  type(dim3) :: grid, tBlock

  tBlock = dim3(256,1,1)
  grid = dim3(ceiling(real(N)/tBlock%x),1,1)

  x = 1.0; y = 2.0; a = 2.0
  x_d = x
  y_d = y
  call saxpy<<<grid, tBlock>>>(x_d, y_d, a)
  y = y_d
  write(*,*) 'Max error: ', maxval(abs(y-4.0))
end program testSaxpy


Дээрх кодноос Фортран 90 хэлний бүтцийг харж болно. Фортран 90 хэлэнд Модуль маш чухал үүрэгтэй ба модуль дотор дэд програм илэрхийлэгддэг. Дараа нь үндсэн кодонд дотроо модулаа дуудаж оруулна. Модуль нь дан ганц програмд зориулагдаагүй, өөр өөр програмуудад зориулсан тохиромжтой байдаг. Дээрх кодонд 1-12 т модуль, 14-32 т үндсэн код оршиж байна. 
Тэгэхээр модуль нь зэрэгцээ кодны хувьд Цөм, үндсэн код нь эзэн код болж таарна. Толгой тань эргээд байвал үндсэн код нь гол үндсэн код, бусад функц, модуль энэ тэр нь төхөөрмжийн код буюу цөм болно гэсэн үг. 

Эхлээд эзэн кодыг тайлбарлая. Анхаарлаа 14-ээр мөрнөөс доош хандуулна уу. 
  use mathOps
  use cudafor
Дээрхийн эхнийх нь хэрэглэгчийн тодорхойлсон модульны нэр байна. Та олон модуль бичсэн бол олон удаа use гээд л модульнуудынхаа дуудагдах нэрийг нь бичнэ гэсэн үг. Эцэст нь КУДА-гийн модулийг дуудна. Энэ нь хоёр дахь мөр юм. Дээрх кодонд 16-р мөр гэсэн үг. КУДАФОР гэдэг нь програм эхлэхийн өмнө хөрвүүлэгчид одоо зэрэгцээ тооцооллын код орж ирэх гэж байна шүү гэдгийг хэлнэ гэсэн үг юм. 
Модулиудыг дуудаж дууссаны дараа хэрэглэх хувьсагчуудыг зарлах хэрэгтэй болно. Дээрх кодонд 18-21 дээр хувьсагч тогтмолуудыг зарлаж байна. Implicit none бол бүх хэмжигдэхүүнүүд зарлагдсан байгаа гэдгийг бататгаж байгаа Фортраны комманд юм. 
Сонирхолтй зарлал нь дараах юм. 
  real :: x(N), y(N), a
  real, device :: x_d(N), y_d(N)
Энд эхний мөрөнд фортран хэлээр шууд зарласан байгаа учир энэ хувьсагчууд эзэн кодных гэсэн үг. x ба y хувьсагчууд N тооны бүрдэлүүд байна. Өөрөөр хэлбэл нэг хэмжээст вектор гэж болно. Харин дараагийн мөрөнд device гэх шинэ тунхаглал орж ирээд x ба y хоёрыг дахин өөр нэрээр зарласан байна. Энэ хоёр нь төхөөрөмжийн санах ойн дээр хадгалагдаж төхөөрөмжийн кодонд ажиллах юм. Гэхдээ зарлагдахдаа эзэн кодон дээр зарлагдаж байгаа учир эзэн код төхөөрөмжийн санах ойн дээрх мэдээллийг хянах боломжтой гэсэн үг. Энэ талаараа КУДА Фортран КУДА С хэлнээс давуу юм. КУДА С хэлэнд төхөөрөмж болон сервер /эзэн/ хооронд мэдээлэл солилцохын тулд заавал тусгай зам /дэд програм/ хэрэглэдэг. Дээрх дөрвөн бүрдэл (x, y, x_d, y_d) нь фортран хэлний дагуу бүгд санах ойн дээр байрлуулагдаж (allocate) програм дууссаны дараа санах ойгоо чөлөөлөх (deallocate) ёстой. 
КУДА Фортран давуу тал нь эзэн болон төхөөрмжийн хооронд мэдээллийг солилцохдоо эзэн кодон дээр энгийн бичлэг хийхэд л хангаллттай байдаг. Үүний жишээ нь 27, 28-р мөрөнд серверийн санах ойгоос төхөөрөмжийн санах ойруу мэдээллийг хуулж байгаа кодууд байна. Харин төхөөрөмжөөс гарч ирэх мэдээллийг серверийн санах ойруу хуулна гэвэл:
x = x_d
болно. Ердөө энгийн байна. Кодны 29-р мөрөнд ДАХНУгийн цөмийг дуудаж байгаа код байна. 

call saxpy<<<grid, tBlock>>>(x_d, y_d, a)
Энд байгаа гурван гурвалжин хаалтны /triple chevrons/ дундахыг "гүйцэтгэлийн хэлбэр" (execution configuration) гэж нэрлэнэ. Энэ хэдэн торбутархай зэрэгцээ байдлаар төхөөрмж дээр гүйцэтгэгдэх вэ гэдгийг хэлж өгнө. Нэг ёсондоо График боловсруулах нэгж дээр хэсэг бүлэг тооны боловсруулах ангиуд /процессорууд/ байрлах ба тэдгээрт ажлуудыг хэрхэн хуваарилж өгөх хэлбэрийг зааж өгнө гэсэн үг юм. Төхөөрөмж дээр ажиллах цөм, функ бүр гүйцэтгэлийн хэлбэртэй байх ёстой. Өөрөөр хэлбэл КУДА програмчлалд чухал хэмжигдэхүүн нь торын тоо, бутархайн тоо байх нь. 
Хаалтанд байгаа эхний grid гэдэг нь торон /grid/ доторх бутархайн бүлэг хэсгүүдийн тоог  /number of thread blocks in grid/, хоёр дахь tblock нь бүлэг хэсэг доторх бутархайн /number of thread in block/ тоог заана. Бутархайнууд нь бүлэг хэсэг дотор эмхлэгдэн байх ба бүлэг хэсгүүд нь эмхлэгдэн торонд байрлана. Рубикийн шоог бүлэг хэсэг гэж үзвэл бутархайнууд нь рубикийн шооны нэг нүд бахй юм. Харин тор гэдэг нь олон рубикийн шоог өрж босгонон байх жишээгээр ойлгоно уу. Иймд бутархай болон бүлэг хэсэг цаашилбал тор нь олон хэмжээст байх ёстой. Хамгийн багадаа 1, ихдээ 3 байна. Яагаад гэвэл тооцон бодох гэж байгаа бодлого маана ихдээ л 3-н хэмжээстэй байна. 
КУДА Фортранд эдгээр тор, бүлэг хэсэг, бутархайнуудыг чиглүүлэх нэг төрөл байх ба үүнийг type dim3 гэнэ. Энэ төрөл нь гурван хувьсагчтай вектор бөгөөд гурван хувьсагч нь тэгш өнцөгтийн координатын системийн х, у, z болно. Эдгээр координатын утгуудыг өгөхөд тор, бүлэг хэсэг, бутархайгаа хэд байхаа тооцох шаардлагатай. 
Бидний жишээ нэг хэмжигдэхүүнтэй векторууд учир тооцоолол 1 хэмжээстэд явагдана. Иймд бүлэг хэсэг, бутархайн тоог бүхэл тоо байхаар зарлаж утгыг өгөх ёстой. 21-р мөрөнд гүйцэтгэлийн хэлбэрийн хэмжигдэхүүнүүдийг зарлаж, 23, 24-р мөрөнд утгуудыг өгч байна. 
  tBlock = dim3(256,1,1)
  grid = dim3(ceiling(real(N)/tBlock%x),1,1)
Тайлбарлавал х тэнхлэгийн дагуу 256 ширхэг бутархай байна. Бусад чиглэлд нэг нэг бутархай байна гэдэг нь энэ бодлого нэг чиглэлд хийгдэнэ гэсэн үг юм. Хоёр дахь мөрөнд бодлогийн хүрээний урт, х чиглэл дахь бутархайн ширхэгээс хамааруулж бүлэг хэсгийн тоог олж байна. Ингэхдээ фортраны ойролцоо бүхэл тоог олох функцыг хэрэглэж байна. Бодлогод 256 ширхэг бутархай хэрэглэе гэж урьдчилж өгсөн байна. Морь уралдуулах гээд 256 ширхэг шагай цуваан байрлуулсан гэсэн үг. 
Ингээд эзэн кодонд байх онцгой хэсгүүд дуусаж байна. 

Одоо төхөөрөмжийн кодыг тайлбарлая: Анхаарлаа 1-13-р мөрөнд хандуулна уу.
1 ба 2-р мөр нь фортран 90 хэлний бичиглэл явж байгаа. Гол цөм код нь 3-11 - ийн хооронд байна. Цөм эхлэхдээ attribute(global) гэдэг ялгагчийг (qualifier) дэд програмын нэрний өмнө авна. Хэрэв энэ бичигдээгүй байвал уг дэд програм нь цөм биш бөгөөд эзэн кодны боловруулах нэгж дээр л ажиллана гэсэн үг юм. Цөм биш гэдэг нь төхөөрөмжийн код бишээ л гэсэн үг. Цөм дотор зарлагдаж байгаа хэмжигдэхүүнүүд нь төхөөрөмжийн санах ойг ашиглах ба зарлагдахдаа Device энэ тэр гэж зарлагдахгүй, энгийн байдлаар зарлагдана. Яагаад гэвэл цөм нь яг одоо төхөөрөмж дээр ажиллаж байгаа юм. 5 дээр зарлагдаж байгаа x, y нь эзэн кодон дээр зарлагдсан x,y биш бөгөөд цөмийн дуудлагаар (29-р мөрийг 3-р мөртэй цуг хар) x_d, y_d -ийн өмнөөс ажиллана гэсэн үг юм. 6-р мөрөнд а - г зарласан ба а нь эзэн кодны хэмжигдэхүүн бөгөөд value гэж ялгаж өгч байгаа нь эзэн кодноос а-гийн утгыг зөвхөн утга хэлбэрээр авна гэсэн утгатай юм. Бид төхөөрөмжийн кодонд а-гийн утгыг өөрөөр өгсөн ч эзэн кодонд анхныхаа утгаар хэвээр байна. Value ялгагч нь уг хэмжигэдхүүнийг тур зуурын хуурмаг хэмжигдэхүүн болгож өөрчилдөг. Ингээд 9 болон 10-р мөрөнд цөмийн гол үйлдлүүд хийгдэж байна. 
    i = blockDim%x * (blockIdx%x - 1) + threadIdx%x
    if (i <= n) y(i) = y(i) + a*x(i)
Дээрхийн эхний мөрөнд элементийн дугаарыг олж байна. Өөрөөр хэлбэл цөм нь хэд хэдэн бутархайг зэрэгцээ байдлаар гүйцэтгэдэг гэх хэлсэн байгаа. Энгийн байдлаар тооцоо хийхдээ i = 1,n хүртэл гэж байгаад үйлдлүүдийг дараалан гүйцэтгэдэгээс ялгаатайгаар эхний ээлжинд тэдэн бутархайн дээр үйлдлийг хий гэдгийг зааж өгч байгаа юм. Тэгэхээр бутархай бүр өөрийн гэсэн дугаартай байх ба i нь тэр дугаар юм. Энэ дугаарыг blockDim, BlockIdx, threadIDx гэсэн урьчилан тодорхойлсон хэмжигдэхүүнээр олох ба эдгээр нь төрөл dim3 доторх утгууд бөгөөд цөмийг дуудахад хэрэглэсэн гүйцэтгэлийн хэлбэрүүд юм. Тухайлбал blockDim нь хоёр дахь гүйцэтгэлийн хэмжигдэхүүн tblock той ижилхэн бөгөөд бүлэг хэсэг дотохи бутархайн тоог илтгэнэ.
Тэгвэл BlockIdx нь торон доторхи бүлэг хэсгийн тоо, threadIDx - бутархайн тоог өгнө. Иймд i нь тухайн бутархай хэсгийн цор ганц дугаар байх юм. 

КУДА Фортран кодыг хөрвүүлэх
КУДА Фортран код нь *.cuf, *.CUF гэсэн өргөтгөлтэй байж КУДА Фортран хөрвүүлэгч дээр ажиллана. Хэрэв КУДА Фортран код энгийн фортраны өргөтгөлтэй байх юм бол -Mcuda гэсэн сонголтыг хэрэглэж хөрвүүлэгдэх ёстой. 

1
2
3
4
5
6
7
8
Last login: Sat Dec 10 10:02:57 2016 from pascal2.nagaokaut.ac.jp
-bash-3.2$ ssh -l s147014 tesla09
s147014@tesla09's password:
Last login: Sat Dec 10 10:03:15 2016 from grouse.nagaokaut.ac.jp
-bash-3.2$ cd LBMtest/gpu/SAXPY/
-bash-3.2$ pgf90 -o saxpy saxpy.cuf
-bash-3.2$ ./saxpy
 Max error:     0.000000
Ингээд хөрвүүлээд бодсон байна. Кодыг хөрвүүлж байгаа нь дээрхийн 6-р мөрөнд байна. КУДА Фортраны хөрвүүлэгчийг Фортланд групп гаргадаг учир хөрвүүлэх комманд нь pgf байна. КУДА Фортран нь фортраны 90 хувилбар дээр үндэслэсэн учир pgf90 гэж хөрвүүлэхдээ бичиж байгаа юм. Бодуулахдаа ЛИНУКС шиг ./обьект файл гээд бодуулна. 

No comments:

Post a Comment