㈠ cuda並行程序設計 gpu編程指南
你好,
首先,cg,opengl,glsl都是跟計算機圖形有關的。cg基本是做渲染的,opengl是一個開源圖形庫,和微軟的direct3d是一樣的。glsl是shading
language
,專門用來寫shader的,在gpgpu(
general
purpose
gpu)概念出來之前,好多人用glsl來做並行計算。
其次,cuda和opencl是兩個專門做gpu運算的庫。cuda非常好用,它有自己的nvcc編譯器,和各個系統都兼容很好,但是僅限於用於nvidia自己的顯卡。opencl雖然任何顯卡都可以使用,但是它的gpu的代碼要放到單獨的一個文本文件中編譯,操作上要比cuda要復雜。
最後,其實cuda和opencl學那個多一樣,因為並行運算的思想是一樣的。推薦你兩本書:
1.
programming
massively
parallel
processors
2nd(入門)
2.
cuda
programming
a
developer-'s
guide
to
parallel
computing
with
gpus
(高級一點)
謝謝,望採納
㈡ 如何進行CUDA C程序核函數的調試
由於CUDA調試工具的不完善、CUDA調試工具上手難度較高,並行思想本身就難調試等因素,CUDA調試一直都是一件很蛋疼的事情。寫CUDA也有三四年了,前段時間在群里見別人問CUDA調試的問題,突然有想法寫個CUDA調試的博客。自己經驗尚淺,希望各位大大看過後能夠在評論里指點一二,共同完善這篇博客。
本博客只針對邏輯bug。
1 定位bug
出現bug的第一想法自然是定位bug。cuda比較奇特的地方在於,有時報錯bug在500行,但500行出的代碼沒有錯誤,而是在1000行的地方邏輯錯了,十分頭疼。
下面介紹三種我總結的定位bug方法:
1.1 二分法
一半一半的注釋代碼,定位bug。比較笨拙和麻煩,但是十分好用。
1.2 輸出定位法
將整體代碼分為幾個模塊,正常的CUDA代碼大概可以分為數據返純初始化,內存申請,內存拷貝,核函數執行,結果拷貝等模塊。在每個模塊結束後輸出標志,示例如圖1。這樣在調試時就可以根據輸出快速定位bug大約在什麼位置。如下圖:
㈢ CUDA編程中常數存儲器的賦值方法
__constant__坦滲intt_HelloCUDA[11]
inthello[11]={0,1,2,3,4,5,6,7,8,9,10};
cudaMemcpyToSymbol(HelloCUDA,hello,sizeof(hello));
這樣會不會有什讓祥脊么宴逗不同?
㈣ 如何使用CUDA 顯卡編程
第一步 先確定你的顯卡 是不是N卡(控制面板 》系統》設備管理器》顯示適配器)
第二步 查看你的顯卡 在不在 支持的顯卡 行列 https://developer.nvidia.com/cuda-gpus點擊打開鏈接
第三步 安裝( windows電腦中 須是 vs2008 vs2005)
CUDA Development Tools https://developer.nvidia.com/cuda-downloads點擊打開鏈接
NVIDIA CUDA Getting Started Guide for Microsoft Windows
Introction
CUDA™ is a parallel computing platform and programming model invented by NVIDIA. It enables dramatic increases in computing performance by harnessing the power of the graphics processing unit (GPU).
CUDA was developed with several design goals in mind:
Provide a small set of extensions to standard programming languages, like C, that enable a straightforward implementation of parallel algorithms. With CUDA C/C++, programmers can focus on the task of parallelization of the algorithms rather than spending time on their implementation.
Support heterogeneous computation where applications use both the CPU and GPU. Serial portions of applications are run on the CPU, and parallel portions are offloaded to the GPU. As such, CUDA can be incrementally applied to existing applications. The CPU and GPU are treated as separate devices that have their own memory spaces. This configuration also allows simultaneous computation on the CPU and GPU without contention for memory resources.
CUDA-capable GPUs have hundreds of cores that can collectively run thousands of computing threads. These cores have shared resources including a register file and a shared memory. The on-chip shared memory allows parallel tasks running on these cores to share data without sending it over the system memory bus.
This guide will show you how to install and check the correct operation of the CUDA development tools.
System Requirements
To use CUDA on your system, you will need the following:
CUDA-capable GPU
Microsoft Windows XP, Vista, 7, or 8 or Windows Server 2003 or 2008
NVIDIA CUDA Toolkit (available at no cost from http://www.nvidia.com/content/cuda/cuda-downloads.html)
Microsoft Visual Studio 2008 or 2010, or a corresponding version of Microsoft Visual C++ Express
About This Document
This document is intended for readers familiar with Microsoft Windows XP, Microsoft Windows Vista, or Microsoft Windows 7 operating systems and the Microsoft Visual Studio environment. You do not need previous experience with CUDA or experience with parallel computation.
Installing CUDA Development Tools
The installation of CUDA development tools on a system running the appropriate version of Windows consists of a few simple steps:
Verify the system has a CUDA-capable GPU.
Download the NVIDIA CUDA Toolkit.
Install the NVIDIA CUDA Toolkit.
Test that the installed software runs correctly and communicated with the hardware.
㈤ gpu高性能編程cuda實戰的前言
本書介紹了如何利用計算機中圖形處理器(Graphics Process Unit, GPU)的強大計算功能來編寫各種高性能的應用軟體。雖然GPU的設計初衷是用於在顯示器上渲染計算機圖形(現在仍然主要用於這個目的),但在科學計算、工程、金融以及其他領域中,人們開始越來越多地使用GPU。我們將解決非圖形領域中的問題的GPU程序統稱為通用GPU程序。值得高興的是,雖然你需要具備C或者C++的知識才能充分理解本書的內容,但卻不需要具備計算機圖形學的知識。任何圖形學的基礎都不要!GPU編程只是使你進一步增強現有的編程技術。
在NVIDIA GPU上編寫程序來完成通用計算任務之前,你需要知道什麼是CUDA。NVIDIA GPU是基於CUDA架構而構建的。你可以將CUDA架構視為NVIDIA構建GPU的模式,其中GPU既可以完成傳統的圖形渲染任務,又可以完成通用計算任務。要在CUDA GPU上編程,我們需要使用CUDA C語言。在本書前面的內容中可以看到,CUDA C本質上是對C進行了一些擴展,使其能夠在像NVIDIA GPU這樣的大規模並行機器上進行編程。
我們為經驗豐富的C或者C++程序員編寫了本書,這些程序員通常較為熟悉C語言,因此能很輕松地閱讀或者編寫C代碼。本書不僅將進一步增強你的C語言編程能力,而且還能作為使用NVIDIA的CUDA C編程語言的一本快速入門書籍。你既不需要具備任何在大規模軟體架構上工作的經驗,也不需要有編寫過C編譯器或者操作系統內核的經歷,此外也無需了解ANSI C標準的細枝末節。本書並沒有花時間來回顧C語言的語法或者常用的C庫函數,例如malloc()或者memcpy(),我們假設你對這些概念已經非常熟悉了。
雖然本書的目的並不是介紹通用的並行編程技術,但你在書中仍將學習到一些通用的並行編模式。此外,本書並不是一本詳細介紹CUDA API的參考書,也不會詳細介紹在開發CUDA C軟體時可以使用的各種工具。因此,我們強烈建議將本書與NVIDIA的免費文檔結合起來閱讀,例如《NVIDIA CUDA Programming Guide》和《NVIDIA CUDA Best Practices Guide》等。然而,你不用費工夫去收集所有這些文檔,因為我們將介紹你需要的所有內容。
不會費太多的周折,CUDA C編程領域歡迎你的到來!
㈥ cuda編程前的環境配置
CUDA開發環境配置
依次安裝 Driver,Toolkit,SDK。注意最好安裝路徑中不含空格。
使用開勇的CUDA_VS_Wizard (http://sourceforge.net/projects/cudavswizard/) 配置Visual Studio 2008的CUDA項目
安裝Visual AssistantX
打開VS, 選擇 工具->選項->項目與解決方案->VC++項目設置,在「C/C++文件擴展名」後添加*.cu,在「包括的擴展名」後添加.cu
打開Visual AssistantX設置,在Projects->C/C++ Directories 里,Platform選擇Custom,Show Directories for選擇Stable include files,添加CUDA Toolkit的include目錄路徑
導入注冊表(點我),讓Visual AssistantX支持CUDA的cu文件和語法高亮
在系統環境變數添加一個新項,隨便起名。這里作為例子,取CUDA_DLL。
值填寫SDK裡面\C\Bin\win32\下面的四個目錄(64位系統將win32改成win64)。
(例如sdk安裝在目錄E:\CUDA\win7_64_2.3\sdk里,則CUDA_DLL環境變數的值應為:
E:\CUDA\win7_64_2.3\sdk\C\win64\Debug;
E:\CUDA\win7_64_2.3\sdk\C\win64\EmuDebug;
E:\CUDA\win7_64_2.3\sdk\C\win64\EmuRelease;
E:\CUDA\win7_64_2.3\sdk\C\win64\Release
再在PATH環境變數最後添加%CUDA_DLL%
2009/12/20 Update:
在64位系統,完成以上步驟後,在vs新建項目時遇到錯誤"Err Source: CreateCustomProject"
解決方法:在控制面板->添加刪除程序,進入vs的維護模式,勾選Visual C++下面的x64編譯器(此選項在默認是沒有安裝的),之後可能會遇到找不到"SQLSysClrTypes.msi"的問題,取消之即可(這個文件在vs2008 sp1的iso裡面有,但無論我選擇sp1 iso的根目錄還是該文件所在的目錄,均無法繼續安裝)
㈦ 如何在vc6.0環境下進行cuda編程
nvcc現在支持的只有vs7.0和vs8.0 就是vc2003和vc2005
不過也可以試試VC6的:
例如一個編譯選項這樣的:
nvcc.exe -ccbin "C:\Program Files\Microsoft Visual Studio 8\VC\bin"
-deviceemu -link -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler
/EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/MTd -IC:\CUDA\include -I./
-I"C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\inc"
-L"C:\CUDA\lib" -lcudart -L"C:\Program Files\NVIDIA Corporation\NVIDIA
CUDA SDK\common\lib" -lcutil32" simpleTexture.cu
or
nvcc.exe -ccbin "C:\Program Files\Microsoft Visual Studio 8\VC\bin"
-deviceemu -link -D_DEBUG -DWIN32 -D_CONSOLE -D_MBCS -Xcompiler
/EHsc,/W3,/nologo,/Wp64,/Od,/Zi,/RTC1,/MTd -IC:\CUDA\include -I./
-I"C:\Program Files\NVIDIA Corporation\NVIDIA CUDA SDK\common\inc"
"C:\CUDA\lib/cudart.lib" "C:\Program Files\NVIDIA Corporation\NVIDIA
CUDA SDK\common\lib/cutil32.lib" simpleTexture.cu
你可以把vc的路徑換成vc6的,試試,我沒有vc6,所以不好給lz測試,見諒;
如果是模擬運行,就是把編譯環境添加一個-deviceemu 編譯選項就可以了。隨便說一句,現在調試只能在模擬運行的debug模式下才行;
如果是正版問題,那lz可以看看linux;
㈧ cuda程序無法傳數據到顯存
方法如下:
1、CPU和GPU之間
1)CPU->GPU
從CPU向GPU傳輸數據,最為人熟知的就是cudaMemcpy了。
默認情況下,數據是從系統的分頁內存先到鎖頁內存,然後再到GPU顯存。因此如果顯式指定使用鎖頁內存,是可以加快數據傳輸速度的。
(鎖頁內存,在cuda編程里使用CudaHostMalloc分配。實質上和linux的mlock系統調用一樣,就是給內存頁打上標記,不讓操作系統將其從物理內存交換到硬碟)
至於為什麼cuda要這樣設計,個人理解是為了實現的方便。因為操作系統已經處理了硬碟和物理內存間的頁交換等情況,顯卡驅動只需要實現物理內存到GPU顯存這一種數據傳輸即可,不需要把操作系統內存管理的事情再做一遍。
2) GPU->CPU
GPU向CPU拷貝數據時,鎖頁內存同樣比分頁內存快
值得一提的是,適當使用pinned memory顯然可以加快IO速度。但是並不是越多越好,因為鎖頁內存是完全獨佔住了物理內存,操作系統無法調度,可能會影響系統整體性能。
3)同一張GPU卡內部
同一張卡內兩塊顯存對拷,實測P40上高達~285GB/s。也比較接近於GPU卡本身的訪存速度
4)數據拷貝的overhead
在上面的測試數據中,可以看到傳輸數據量從1M->32M增長的過程中,測得的傳輸帶寬是有逐漸增加的。
這是因為每次調用cuda api進行數據傳輸都有overhead,在數據量小的時候這個overhead在數據傳輸時間中的佔比就顯得很高。這也提示我們盡量合並小數據的傳輸
2、同機的GPU之間
一般可以通過cudaMemcpyPeer/cudaMemcpyPeerAsync函數進行顯存拷貝
1)cudaMemcpyPeer withoutP2P
/********代碼示例*******/
cudaSetDevice(1);
cudaMalloc((int**)&dest, bytes);
cudaSetDevice(2);
cudaMalloc((int**)&dsrc, bytes);
cudaMemcpyPeer(dest, 1, dsrc, 2, bytes);
通過nvprof+nvpp可以看到:禁用GPU P2P時,數據是先從GPU2拷貝到系統內存(DtoH),然後再從系統內存拷貝到GPU1(HtoD)
當然,這里是在一個進程內做GPU之間的數據拷貝。如果是2個進程分別運行在GPU1和GPU2上,那在CPU上這2個進程間可以通過共享內存或者socket通信來完成數據的拷貝。
2)cudaMemcpyPeer withP2P
/********代碼示例*******/
cudaSetDevice(1);
cudaMalloc((int**)&dest, bytes);
cudaSetDevice(2);
cudaMalloc((int**)&dsrc, bytes);
cudaDeviceEnablePeerAccess(1,0);
cudaDeviceEnablePeerAccess(2,0);
cudaMemcpyPeer(dest, 1, dsrc, 2, bytes);
啟用GPU P2P時,數據直接從GPU2拷貝到了GPU1,不再經過系統內存。
3)通過變數賦值方式傳輸數據
深度學習中,卡之間傳遞的數據其實很多都是參數數值,因此也可以直接用一個GPU內的變數給另一個GPU上的變數賦值來進行數據傳輸
/********代碼示例*******/
(&numBlocks, &blockSize, p2p_float);
p2p_float<<
(float *)dest, (float *)src, num_elems);
__global__ void p2p_float(float *__restrict__ dest, float const *__restrict__ src,
size_t num_elems) {undefined
size_t globalId = blockIdx.x * blockDim.x + threadIdx.x;
size_t gridSize = blockDim.x * gridDim.x;
#pragma unroll(5)
for (size_t i = globalId; i < num_elems; i += gridSize) {undefined
dest[i] = src[i];
}
}
㈨ cuda編程,把CPU轉到CUDA的編程,這演算法有點不正確!求解
cuda是基於標准c語言的,你先把c語言的基礎學好,然後動手自己寫一些c語言的程序,等對c語言有一定的功底之後,再看cuda,cuda與c語言的不同之處我覺得在於那個內核函數,以及如何劃分線程塊和柵格的緯度和大小,以及如何實現對於線程的索引的搜索,讓每一個線程處理對應的一個變數或者幾個變數。
然後是cuda的一些基礎的語法,這些你可以看一些簡單的cuda的例子,例如矩陣相加的例子,通過這些程序的例子可以很好的理解這些語法。
㈩ cuda編程
從字面上解釋。。。應該是使用了太多的本地數據。。。。
使用的本地數據佔了0x706c bytes
但是最大隻有0x4000 bytes
希望對你有點幫助。。。。