導航:首頁 > 編程語言 > cudac語言編程指南

cudac語言編程指南

發布時間:2024-04-23 15:20:06

『壹』 如何學習cuda c

1、CUDAC編寫WindowsConsoleApplication

下面我們從一個簡單的例子開始學習CUDAC。

打開VS,新建一個CUDAWinApp項目,項目名稱為Vector,解決方案名稱為CUDADemo。依次點擊「確定」,「下一步」,選擇Emptyproject。點擊「Finished」。這樣一個CUDA的項目就建成了。

右鍵點擊Vector項目,依次選擇「添加」、「新建項」、「代碼」、「CUDA」。在名稱中輸入要添加的拿唯則文件名。如Vector.cu。然後點擊添加。

下面在Vector.cu文件里實現兩個向量相加的程序。

//添加系統庫

#include

#include

//添加CUDA支持

#include

__global__voidVecAdd(float*A,float*B,float*C);

__host__voidrunVecAdd(intargc,char**argv);

intmain(intargc,char**argv)

{

runVecAdd(argc,argv);

CUT_EXIT(argc,argv);

}

__host__voidrunVecAdd(intargc,char**argv)

{//初始化host端內存數據

constunsignedintN=8;//向量維數

constunsignedintmemSize=sizeof(float)*N;//需要空間的位元組數

float*h_A=(float*)malloc(memSize);

float*h_B=(float*)malloc(memSize);

float*h_C=(float*)malloc(memSize);

for(unsignedinti=0;i<N;i++)

{h_A[i]=i;h_B[i]山唯=i;}

//設備端顯存空間

float*d_A,*d_B,*d_C;

//初始化Device

CUT_DEVICE_INIT(argc,argv);

CUDA_SAFE_CALL(cudaMalloc((void**)&d_A,memSize));

CUDA_SAFE_CALL(cudaMalloc((void**)&d_B,memSize));

CUDA_SAFE_CALL(cudaMalloc((void**)&d_C,memSize));

CUDA_SAFE_CALL(cudaMemcpy(d_A,h_A,memSize,cudaMemcpyHostToDevice));

CUDA_SAFE_CALL(cudaMemcpy(d_B,h_B,memSize,cudaMemcpyHostToDevice));

VecAdd<<<1,N,memSize>>>(d_A,d_B,d_C);

CUT_CHECK_ERROR("Kernelexecutionfailed");

CUDA_SAFE_CALL(cudaMemcpy(h_C,d_C,memSize,cudaMemcpyDeviceToHost));

for(unsignedinti=0;i<N;i++)

{printf("%.0f",h_C[i]);}

free(h_A);free(h_B);free(h_C);

CUDA_SAFE_CALL(cudaFree(d_A));

CUDA_SAFE_CALL(cudaFree(d_B));

CUDA_SAFE_CALL(cudaFree(d_C));

}

__global__voidVecAdd(float*A,float*B,float*C)

{

//分配sharedmemory

extern__shared__floats_A[];

extern__shared__floats_B[];

extern__shared__floats_C[];

//從globalmemory拷貝到sharedmemory

constunsignedinti=threadIdx.x;

s_A[i]=A[i];

s_B[i]=B[i];

//計算

s_C[i]=s_A[i]+s_B[i];

//拷貝到globalmemory

C[i]=s_C[i];

}

由於這里不是講CUDA編程的,關於它的編程模型已經超出了我要介紹的范圍,您可以閱讀消棚《GPU高性能運算之CUDA》來獲得CUDA編程模型的知識。

編譯Vector項目,執行此項目後會得到圖1如下輸出:

圖1Vector項目執行結果

2、CUDAC編寫DLL模塊

更多情況下的您的軟體可能只是使用CUDA來實現一段程序的加速,這種情況下我們可以使用CUDAC編寫DLL來提供介面。下面我們就將例1編譯成DLL。

在剛才的CUDADemo解決方案目錄下添加一個新的CUDA項目(當然您也可以重新建立一個解決方案)。項目名為VecAdd_dynamic。ApplicationType選為DLL,AdditionalOptions選擇EmptyProject。

第一步,添加頭文件,文件名最好與工程名同名,這樣便於您的維護工作。這里我向項目中添加了VecAdd_dynamic.h,在此頭文件中添加如下代碼

#ifndef_VECADD_DYNAMIC_H_

#define_VECADD_DYNAMIC_H_

//並行計算N維向量的加法

__declspec(dllexport)voidVecAdd(float*h_A,float*h_B,float*h_C,intN);

#endif

第二步,添加cpp文件,文件名為VecAdd_dynamic.cpp,在此文件中添加如下代碼

#include

#include"VecAdd_dynamic.h"

#ifdef_MANAGED

#pragmamanaged(push,off)

#endif

BOOLAPIENTRYDllMain(HMODULEhMole,DWORDul_reason_for_call,LPVOIDlpReserved)

{

returnTRUE;

}

#ifdef_MANAGED

#pragmamanaged(pop)

#endif

第三步,添加def文件,此文件的功能就是確保其它廠商的編譯器能夠調用此DLL里的函數。這一點非常關鍵,因為您的程序可能用到多個廠家的編譯器。文件名為VecAdd_dynamic.def。向該文件中添加:

EXPORTS

VecAdd

第四步,添加cu文件,文件名為VecAdd_dynamic.cu。注意此文件最好直接添加到項目目錄下,不要添加到源文件選項卡或其它已有的選項卡下。

在cu文件里添加如下代碼,實現要導出的函數。

#include

#include

#include

#if__DEVICE_EMULATION__

boolInitCUDA(void)

{returntrue;}

#else

boolInitCUDA(void)

{

intcount=0;

inti=0;

cudaGetDeviceCount(&count);

if(count==0)

{

fprintf(stderr,"Thereisnodevice./n");

returnfalse;

}

for(i=0;i<count;i++)

{

cudaDevicePropprop;

if(cudaGetDeviceProperties(&prop,i)==cudaSuccess)

{

if(prop.major>=1)

{break;}

}

}

if(i==count)

{

fprintf(stderr,"ThereisnodevicesupportingCUDA./n");

returnfalse;

}

cudaSetDevice(i);

printf("CUDAinitialized./n");

returntrue;

}

#endif

__global__voidD_VecAdd(float*g_A,float*g_B,float*g_C,intN)

{

unsignedinti=threadIdx.x;

if(i<N)

{g_C[i]=g_A[i]+g_B[i];}

}

voidVecAdd(float*h_A,float*h_B,float*h_C,intN)

{

if(!InitCUDA())

{return;}

float*g_A,*g_B,*g_C;

unsignedintsize=N*sizeof(float);

CUDA_SAFE_CALL(cudaMalloc((void**)&g_A,size));

CUDA_SAFE_CALL(cudaMalloc((void**)&g_B,size));

CUDA_SAFE_CALL(cudaMalloc((void**)&g_C,size));

CUDA_SAFE_CALL(cudaMemcpy(g_A,h_A,size,cudaMemcpyHostToDevice));

CUDA_SAFE_CALL(cudaMemcpy(g_B,h_B,size,cudaMemcpyHostToDevice));

D_VecAdd<<<1,N>>>(g_A,g_B,g_C,N);

CUDA_SAFE_CALL(cudaMemcpy(h_C,g_C,size,cudaMemcpyDeviceToHost));

cudaFree(g_A);cudaFree(g_B);cudaFree(g_C);

}

第五步,如果您已經正確完成了以上四步,那麼剩下的就只有編譯,只要您用過VS,這一步就不需要我介紹了吧。成功之後,在您的解決方案文件目錄下的Debug文件夾下會有一個VecAdd_dynamic.dll文件。

3、在.NET中使用CUDAC編寫的DLL

下面介紹在託管程序中如何使用VecAdd_dynamic.dll。

第一步,在上面的解決方案CUDADemo下添加一個C++/CLR的Windows窗體應用程序,工程名為NETDemo(當然您也可以重新建一個解決方案,工程名也是隨意的)。

第二步,在窗體上添加一個按鈕,名字隨意,我將它的現實文本改為「調用CUDA_DLL」,給這個按鈕添加click事件。我們的代碼將在這個事件里添加調用VecAdd()的程序。在窗體上添加一個文本框用來顯示調用輸出的結果。

第三步,代碼實現。為工程NETDemo添加一個頭文件,我將它命名為Win32.h,這個文件中主要是實現VecAdd()函數的導入。在此文件中添加如下代碼

#pragmaonce

namespaceWin32

{

usingnamespaceSystem::Runtime::InteropServices;

[DllImport("VecAdd_dynamic.dll",EntryPoint="VecAdd",CharSet=CharSet::Auto)]

extern"C"voidVecAdd(float*h_A,float*h_B,float*h_C,intN);

}

在Form1.h中,#pragmaonce之後namespaceNETDemo之前添加以下代碼。

#include"Win32.h"

#include

在button1_Click()中添加如下代碼

intN=8;

float*h_A=(float*)malloc(N*sizeof(float));

float*h_B=(float*)malloc(N*sizeof(float));

float*h_C=(float*)malloc(N*sizeof(float));

for(inti=0;i<N;i++)

{h_A[i]=i;h_B[i]=i;}

Win32::VecAdd(h_A,h_B,h_C,N);

String^reslut;

for(inti=0;i<N;i++)

{reslut+=Convert::ToString(h_C[i])+",";}

this->textBox1->Text=Convert::ToString(reslut);

free(h_A);free(h_B);free(h_C);

第四步、執行NETDemo項目。點擊「調用CUDA_DLL」,您會看到圖3所示的結果

圖3NETDemo運行結果

到現在為止您已經完全可以正確使用CUDA了。

『貳』 如何進行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並行程序設計 gpu編程指南 pdf

這本書非常好,絕對是CUDA編程的一個必不可少的工具書。

但是我建議樓主讀原著的英文版的更好一點,中文版的翻譯有的地方並不準確。

下面是下載文件:


望採納

『肆』 linux下CUDA程序一般怎麼編譯

有以下步驟:

1.源程序的編譯
在Linux下面,如果要編譯一個C語言源程序,我們要使用GNU的gcc編譯器. 下面
我們以一個實例來說明如何使用gcc編譯器.
假設我們有下面一個非常簡單的源程序(hello.c):
int main(int argc,char **argv)
{
printf("Hello Linux\n");
}
要編譯這個程序,我們只要在命令行下執行:
gcc -o hello hello.c
gcc 編譯器就會為我們生成一個hello的可執行文件.執行./hello就可以看到程
序的輸出結果了.命令行中 gcc表示我們是用gcc來編譯我們的源程序,-o 選項表示
我們要求編譯器給我們輸出的可執行文件名為hello 而hello.c是我們的源程序文件.
gcc編譯器有許多選項,一般來說我們只要知道其中的幾個就夠了. -o選項我們
已經知道了,表示我們要求輸出的可執行文件名. -c選項表示我們只要求編譯器輸出
目標代碼,而不必要輸出可執行文件. -g選項表示我們要求編譯器在編譯的時候提
供我們以後對程序進行調試的信息.
知道了這三個選項,我們就可以編譯我們自己所寫的簡單的源程序了,如果你
想要知道更多的選項,可以查看gcc的幫助文檔,那裡有著許多對其它選項的詳細說
明.
2.Makefile的編寫
假設我們有下面這樣的一個程序,源代碼如下:

#include "mytool1.h"
#include "mytool2.h"
int main(int argc,char **argv)
{
mytool1_print("hello");
mytool2_print("hello");
}

#ifndef _MYTOOL_1_H
#define _MYTOOL_1_H
void mytool1_print(char *print_str);
#endif

#include "mytool1.h"
void mytool1_print(char *print_str)
{
printf("This is mytool1 print %s\n",print_str);
}

#ifndef _MYTOOL_2_H
#define _MYTOOL_2_H
void mytool2_print(char *print_str);
#endif

#include "mytool2.h"
void mytool2_print(char *print_str)
{
printf("This is mytool2 print %s\n",print_str);
}
當然由於這個程序是很短的我們可以這樣來編譯
gcc -c main.c
gcc -c mytool1.c
gcc -c mytool2.c
gcc -o main main.o mytool1.o mytool2.o
這樣的話我們也可以產生main程序,而且也不時很麻煩.但是如果我們考慮一
下如果有一天我們修改了其中的一個文件(比如說mytool1.c)那麼我們難道還要重
新輸入上面的命令?也許你會說,這個很容易解決啊,我寫一個SHELL腳本,讓她幫我
去完成不就可以了.是的對於這個程序來說,是可以起到作用的.但是當我們把事情
想的更復雜一點,如果我們的程序有幾百個源程序的時候,難道也要編譯器重新一
個一個的去編譯?
為此,聰明的程序員們想出了一個很好的工具來做這件事情,這就是make.我們
只要執行以下make,就可以把上面的問題解決掉.在我們執行make之前,我們要先
編寫一個非常重要的文件.--Makefile.對於上面的那個程序來說,可能的一個
Makefile的文件是:
# 這是上面那個程序的Makefile文件
main:main.o mytool1.o mytool2.o
gcc -o main main.o mytool1.o mytool2.o
main.o:main.c mytool1.h mytool2.h
gcc -c main.c
mytool1.o:mytool1.c mytool1.h
gcc -c mytool1.c
mytool2.o:mytool2.c mytool2.h
gcc -c mytool2.c
有了這個Makefile文件,不過我們什麼時候修改了源程序當中的什麼文件,我們
只要執行make命令,我們的編譯器都只會去編譯和我們修改的文件有關的文件,其
它的文件她連理都不想去理的.
下面我們學習Makefile是如何編寫的.
在Makefile中也#開始的行都是注釋行.Makefile中最重要的是描述文件的依賴
關系的說明.一般的格式是:
target: components
TAB rule
第一行表示的是依賴關系.第二行是規則.
比如說我們上面的那個Makefile文件的第二行
main:main.o mytool1.o mytool2.o
表示我們的目標(target)main的依賴對象(components)是main.o mytool1.o
mytool2.o 當倚賴的對象在目標修改後修改的話,就要去執行規則一行所指定的命
令.就象我們的上面那個Makefile第三行所說的一樣要執行 gcc -o main main.o
mytool1.o mytool2.o 注意規則一行中的TAB表示那裡是一個TAB鍵
Makefile有三個非常有用的變數.分別是$@,$^,$<代表的意義分別是:
$@--目標文件,$^--所有的依賴文件,$<--第一個依賴文件.
如果我們使用上面三個變數,那麼我們可以簡化我們的Makefile文件為:
# 這是簡化後的Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
main.o:main.c mytool1.h mytool2.h
gcc -c $<
mytool1.o:mytool1.c mytool1.h
gcc -c $<
mytool2.o:mytool2.c mytool2.h
gcc -c $<
經過簡化後我們的Makefile是簡單了一點,不過人們有時候還想簡單一點.這里
我們學習一個Makefile的預設規則
.c.o:
gcc -c $<
這個規則表示所有的 .o文件都是依賴與相應的.c文件的.例如mytool.o依賴於
mytool.c這樣Makefile還可以變為:
# 這是再一次簡化後的Makefile
main:main.o mytool1.o mytool2.o
gcc -o $@ $^
.c.o:
gcc -c $<
好了,我們的Makefile 也差不多了,如果想知道更多的關於Makefile規則可以查
看相應的文檔.

3.程序庫的鏈接
試著編譯下面這個程序

#include
int main(int argc,char **argv)
{
double value;
printf("Value:%f\n",value);
}
這個程序相當簡單,但是當我們用 gcc -o temp temp.c 編譯時會出現下面所示
的錯誤.
/tmp/cc33Ky.o: In function `main':
/tmp/cc33Ky.o(.text+0xe): undefined reference to `log'
collect2: ld returned 1 exit status
出現這個錯誤是因為編譯器找不到log的具體實現.雖然我們包括了正確的頭
文件,但是我們在編譯的時候還是要連接確定的庫.在Linux下,為了使用數學函數,我
們必須和數學庫連接,為此我們要加入 -lm 選項. gcc -o temp temp.c -lm這樣才能夠
正確的編譯.也許有人要問,前面我們用printf函數的時候怎麼沒有連接庫呢?是這樣
的,對於一些常用的函數的實現,gcc編譯器會自動去連接一些常用庫,這樣我們就沒
有必要自己去指定了. 有時候我們在編譯程序的時候還要指定庫的路徑,這個時候
我們要用到編譯器的 -L選項指定路徑.比如說我們有一個庫在 /home/hoyt/mylib下
,這樣我們編譯的時候還要加上 -L/home/hoyt/mylib.對於一些標准庫來說,我們沒
有必要指出路徑.只要它們在起預設庫的路徑下就可以了.系統的預設庫的路徑/lib
/usr/lib /usr/local/lib 在這三個路徑下面的庫,我們可以不指定路徑.
還有一個問題,有時候我們使用了某個函數,但是我們不知道庫的名字,這個時
候怎麼辦呢?很抱歉,對於這個問題我也不知道答案,我只有一個傻辦法.首先,我到
標准庫路徑下面去找看看有沒有和我用的函數相關的庫,我就這樣找到了線程
(thread)函數的庫文件(libpthread.a). 當然,如果找不到,只有一個笨方法.比如我要找
sin這個函數所在的庫. 就只好用 nm -o /lib/*.so|grep sin>~/sin 命令,然後看~/sin
文件,到那裡面去找了. 在sin文件當中,我會找到這樣的一行libm-2.1.2.so:00009fa0
W sin 這樣我就知道了sin在 libm-2.1.2.so庫裡面,我用 -lm選項就可以了(去掉前面
的lib和後面的版本標志,就剩下m了所以是 -lm).

4.程序的調試
我們編寫的程序不太可能一次性就會成功的,在我們的程序當中,會出現許許
多多我們想不到的錯誤,這個時候我們就要對我們的程序進行調試了.
最常用的調試軟體是gdb.如果你想在圖形界面下調試程序,那麼你現在可以選
擇xxgdb.記得要在編譯的時候加入 -g選項.關於gdb的使用可以看gdb的幫助文件.由
於我沒有用過這個軟體,所以我也不能夠說出如何使用. 不過我不喜歡用gdb.跟蹤
一個程序是很煩的事情,我一般用在程序當中輸出中間變數的值來調試程序的.當
然你可以選擇自己的辦法,沒有必要去學別人的.現在有了許多IDE環境,裡面已經自
己帶了調試器了.你可以選擇幾個試一試找出自己喜歡的一個用.

5.頭文件和系統求助
有時候我們只知道一個函數的大概形式,不記得確切的表達式,或者是不記得函數在那個頭文件進行了說明.這個時候我們可以求助系統,比如說我們想知道fread這個函數的確切形式,我們只要執行 man fread 系統就會輸出著函數的詳細解釋的.和這個函數所在的頭文件說明了。如果我們要write這個函數說明,當我們執行man write時,輸出的結果卻不是我們所需要的。因為我們要的是write這個函數的說明,可是出來的卻是write這個命令的說明。為了得到write的函數說明我們要用man 2 write。2表示我們用的是write這個函數是系統調用函數,還有一個我們常用的是3表示函數是c的庫函數。

『伍』 c語言 gpu

U越來越強大,GPU為顯示圖像做了優化之外,在計算上已經超越了通用的CPU。如此強大的晶元如果只是作為顯卡就太浪費了,因此NVidia推出CUDA,讓顯卡可以用於圖像計算以外的目的,也就是超於游戲,使得GPU能夠發揮其強大的運算能力。

一年前NVIDIA發布CUDA,這是一種專門針對GPU的C語言開發工具。與以往採用圖形API介面指揮GPU完成各種運算處理功能不同,CUDA的出現使研究人員和工程師可以在熟悉的C語言環境下,自由地輸入代碼調用GPU的並行處理架構。這使得原先需要花費數天數周才能出結果的運算大大縮短到數幾小時,甚至幾分鍾之內。

CUDA是用於GPU計算的開發環境,它是一個全新的軟硬體架構,可以將GPU視為一個並行數據計算的設備,對所進行的計算進行分配和管理。在CUDA的架構中,這些計算不再像過去所謂的GPGPU架構那樣必須將計算映射到圖形API(OpenGL和Direct 3D)中,因此對於開發者來說,CUDA的開發門檻大大降低了。CUDA的GPU編程語言基於標準的C語言,因此任何有C語言基礎的用戶都很容易地開發CUDA的應用程序。

那麼,如何使得CPU與GPU之間很好的進行程序之間的銜接呢?以GPGPU的概念來看,顯卡仍然需要以傳統的DirectX和OpenGL這樣的API來實現,對於編程人員來說,這樣的方法非常繁瑣,而CUDA正是以GPGPU這個概念衍生而來的新的應用程序介面,不過CUDA則提供了一個更加簡便的方案——C語言。我們回顧一下CUDA的發展歷史。

『陸』 CUDA編程基礎——Grid、Block、Thread

本消尺余文主要介紹三者之間的關系。

三者之間關系如圖所示,從中可以看出,三者存在包含關系。每個grid分為多個block,每困棗個block分為多個Thread,grid和block最多可拿滾以是三維的。

『柒』 NVIDIA顯卡支持CUDA,什麼是CUDA

關於CUDA:

CUDA(Compute Unified Device Architecture)是一個新的基礎架構,這個架構可以使用GPU來解決商業、工業以及科學方面的復雜計算問題。它是一個完整的GPGPU解決方案,提供了硬體的直接訪問介面,而不必像傳統方式一樣必須依賴圖形API介面來實現GPU的訪問。在架構上採用了一種全新的計算體系結構來使用GPU提供的硬體資源,從而給大規模的數據計算應用提供了一種比CPU更加強大的計算能力。CUDA採用C語言作為編程語言提供大量的高性能計算指令開發能力,使開發者能夠在GPU的強大計算能力的基礎上建立起一種效率更高的密集數據計算解決方案。

關於NVIDIA CUDA技術
NVIDIA CUDA技術是當今世界上唯一針對NVIDIA GPU(圖形處理器)的C語言環境,為支持CUDA技術的NVIDIA GPU(圖形處理器)帶來無窮的圖形計算處理性能。憑借NVIDIA CUDA技術,開發人員能夠利用NVIDIA GPU(圖形處理器)攻克極其復雜的密集型計算難題,應用到諸如石油與天然氣的開發,金融風險管理,產品設計,媒體圖像以及科學研究等領域。
CUDA™ 工具包是一種針對支持CUDA功能的GPU(圖形處理器)的C語言開發環境。CUDA開發環境包括:

nvcc C語言編譯器
適用於GPU(圖形處理器)的CUDA FFT和BLAS庫
分析器
適用於GPU(圖形處理器)的gdb調試器(在2008年3月推出alpha版)
CUDA運行時(CUDA runtime)驅動程序(目前在標準的NVIDIA GPU驅動中也提供)
CUDA編程手冊
CUDA開發者軟體開發包(SDK)提供了一些範例(附有源代碼),以幫助使用者開始CUDA編程。這些範例包括:

並行雙調排序
矩陣乘法
矩陣轉置
利用計時器進行性能評價
並行大數組的前綴和(掃描)
圖像卷積
使用Haar小波的一維DWT
OpenGL和Direct3D圖形互操作示例
CUDA BLAS和FFT庫的使用示例
CPU-GPU C—和C++—代碼集成
二項式期權定價模型
Black-Scholes期權定價模型
Monte-Carlo期權定價模型
並行Mersenne Twister(隨機數生成)
並行直方圖
圖像去噪
Sobel邊緣檢測濾波器
MathWorks MATLAB® 插件 (點擊這里下載)
新的基於1.1版CUDA的SDK 範例現在也已經發布了。要查看完整的列表、下載代碼,請點擊此處。

技術功能
在GPU(圖形處理器)上提供標准C編程語言
為在支持CUDA的NVIDIA GPU(圖形處理器)上進行並行計算而提供了統一的軟硬體解決方案
CUDA兼容的GPU(圖形處理器)包括很多:從低功耗的筆記本上用的GPU到高性能的,多GPU的系統。
支持CUDA的GPU(圖形處理器)支持並行數據緩存和線程執行管理器
標准FFT(快速傅立葉變換)和BLAS(基本線性代數子程序)數值程序庫
針對計算的專用CUDA驅動
經過優化的,從中央處理器(CPU)到支持CUDA的GPU(圖形處理器)的直接上傳、下載通道
CUDA驅動可與OpenGL和DirectX圖形驅動程序實現互操作
支持Linux 32位/64位以及Windows XP 32位/64位 操作系統
為了研究以及開發語言的目的,CUDA提供對驅動程序的直接訪問,以及匯編語言級的訪問。

閱讀全文

與cudac語言編程指南相關的資料

熱點內容
比較黃的台灣電影 瀏覽:751
圖片批量在線壓縮 瀏覽:705
比較黃的穿越小說 瀏覽:250
電影人狗叫 瀏覽:507
取消壓縮管理的公司 瀏覽:116
打真軍的電影豆瓣 瀏覽:168
特斯拉app超級充電樁如何使用 瀏覽:422
男人懷孕電影袋鼠男人 瀏覽:507
如何刪去應用加密 瀏覽:468
服從命令聽指揮陌千依小說 瀏覽:761
《赤足驚魂》電影介紹 瀏覽:359
ic卡內數據如何傳到伺服器 瀏覽:21
安卓系統如何更改托盤 瀏覽:403
許志安演的電影有哪些 瀏覽:824
odbc文件夾是什麼 瀏覽:391
男主用鐵鏈囚禁女主的小說 瀏覽:914
sift演算法harris演算法 瀏覽:241
python命令行模式 瀏覽:459
新媽媽韓國電影中的輔導老師是誰 瀏覽:389
php郵箱驗證代碼 瀏覽:404