CUDAFunctionLoad

หลังจากที่ลองเขียนโปรแกรมเล่น(ด้วยภาษา C)โดยใช้ CUDA สักพักแล้วเกิดของขึ้นร้อนวิชาอยากจะลองเอาไปใช้งานจริงแต่มันก็ติดว่างานส่วนใหญ่ที่ทำจะใช้ Mathematica เป็นหลัก หลายคำสั่งหรือfunction ที่เขียนขึ้นเองนั้นก็อยู่ใน Mathematica หมด ก็เลยคิดว่าแล้วจะเอาfunction ที่เขียนด้วย CUDA ไปใช้ใน Mathematica ยังไง

หลังจากงมอยู่พักใหญ่ก็พบว่า Mathematica ตั้งแต่เวอร์ชั่น 8 เป็นต้นมาสามารถที่จะใช้ความสามารถของ CUDA ได้โดย package ที่ชื่อ CUDALink ซึ่งมีมาด้วยกับตัว Mathematica แล้ว วิธีการก็เพียงโหลดpackage นี้

<<CUDALink`

จากนั้นเราก็สามารถที่จะเรียกfunction ที่เราเขียนเข้าไปได้ด้วยคำสั่ง CUDAFunctionLoad ครับเช่น

CUDAFunctionLoad example
จะว่าไปแล้ว CUDAFunctionLoad นี่มันก็เจ๋งดีครับทำให้ทุกอย่างง่ายไปหมด แต่ก็ยังมีเรื่องที่ต้องปวดหัวหรือระวังเกี่ยวกับชนิดของตัวแปรครับ

ดูรายละเอียดเพิ่มเติมได้ที่ http://reference.wolfram.com/mathematica/CUDALink/ref/CUDAFunctionLoad.html

CUDA ใน Mathematica ทำให้การคำนวณเร็วขึ้น

ทดลองเปรียบเทียบว่าถ้าใช้ GPU คำนวณใน Mathematica จะเร็วขึ้นจากที่ใช้ CPU มากน้อยเท่าใด  เครื่องที่ใช้ทดสอบคือ Dell Precision T5500 , CPU Xeon 2.66 GHz X5650  RAM 12GB, Windows 7  64-Bit, NVIDIA Quadro 4000, Mathematica 8.0.4

คำสั่งที่ใช้ครับ
a=RandomReal[{0,1},{2048,2048}];
b=RandomReal[{0,1},{2048,2048}];
AbsoluteTiming[Do[CUDADot[a,b];,{100}];]
AbsoluteTiming[Do[Dot[a,b];,{100}];]

c=RandomReal[{0,1},{512,512}];
AbsoluteTiming[Do[CUDAFourier[c];,{100}]]
AbsoluteTiming[Do[Fourier[c];,{100}]]

ปัญหา vcvars64.bat กับ NVCCCompiler

เครื่องที่ผมใช้งานลง Windows 7 64 bits พร้อมกับ Visual C++ Express 2010 กับ Windows SDK 7.1 และ NVIDIA SDKs Toolkit แล้วมีปัญหาในการ compile library ใน Mathematica ด้วย CreateLibrary หรือ CreateExecuteable กับ NVCCCompiler ใน Mathematica ซึ่งมันจะขึ้น $Failed

หลังจากที่งมหาคำตอบนี้อยู่นานก็พบว่า ไฟล์ C:\Program Files (x86)\Microsoft Visual Studio 10.0\VC\vcvarsall.bat” จะมีการเรียก ไฟล์ C:\Program Files (x86)\Microsoft Visual Studio 10.0\vc\bin\amd64\vcvars64.bat ซึ่งมันไม่ได้ติดตั้งมาด้วยกับตัว compiler ดังนั้นผมเลยสร้างไฟล์ vcvars64.bat มาใหม่โดยใส่บรรทัดนี้ลงไปครับ

CALL “C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd” /x64

จากนั้นก็ลงรันคำสั่งCreateLibrary ด้วยNVCCCompiler  แต่ก็ยังไม่สามารถแก้ปัญหาได้ ยังขึ้น $Failed อยู่ แต่ก็ได้ลองเพิ่ม option  “ShellOutputFunction”->Print ดูเพื่อจะได้รู้ว่ามันเกิดปัญหาอะไร  ซึ่งก็พบว่า Mathematica มีการเรียกใช้ files พวก library จาก folder ของ NVIDIA SDKs Toolkit แต่ดันเรียก nvcc.exe จากตัวของ Mathematica เอง ผมเลย uninstall NVIDIA SDKs Toolkit ออกไป แต่ก็ได้เพิ่มตัวแปร Path ด้วย   C:\Users\SLPHYX\AppData\Roaming\Mathematica\Paclets\Repository\CUDAResources-­Win64-8.0.4.1\CUDAToolkit\bin;  C:\Users\SLPHYX\AppData\Roaming\Mathematica\Paclets\Repository\CUDAResources-­Win64-8.0.4.1\CUDAToolkit\open64\bin

(SLPHYX นี่เป็นชื่อ login ของผมครับ)

หลังจากนั้นก็ปิดแล้วเปิด Mathematica ใหม่ แล้วลองใช้ CreateLibrary กับ NVCCCompiler ก็ปรากกฏว่าใช้ได้แล้ว 🙂

ติดตั้ง driver ของ nvidia quadro บน Scientific Linux 6.1

พอดีว่าได้เครื่อง Dell Precision T1600 มาทำงานด้าน Molecular Simulation
เครื่องมีการ์ดจอที่สนับสนุน CUDA มาด้วยคือ Nvidia Quadro 2000
หลังจากติดตั้ง Scientifc Linux (SL6.1) เสร็จแล้ว ก็ทำการเพิ่ม Repository จาก elrepo.org เข้าไป
ตามนี้
rpm –import http://elrepo.org/RPM-GPG-KEY-elrepo.org

rpm -Uvh http://elrepo.org/elrepo-release-6-4.el6.elrepo.noarch.rpm

จากนั้นก็ติดตั้ง package ชื่อ kmod-nvidia

yum –disablerepo=\* –enablerepo=elrepo install kmod-nvidia 

แล้วก็ reboot เครื่องใหม่ เป็นอันเสร็จพิธี

ลอง render โครงสร้างของโปรตีนโดยใช้ VMD ปรากฏว่าเร็วมากอย่างเห็นได้ชัด