1. 程式人生 > >[菜鳥每天來段CUDA_C] 利用頁鎖定記憶體提高運算效率

[菜鳥每天來段CUDA_C] 利用頁鎖定記憶體提高運算效率

本文通過使用malloc分配記憶體和cudaHostAlloc分配頁鎖定記憶體,說明使用頁鎖定記憶體可提高運算效率,並指出哪些場合適合使用頁鎖定記憶體。

malloc分配的是標準的可分頁的(pagable)的主機記憶體,作業系統在對記憶體進行排程的時候可能會將這種記憶體分頁或者交換到磁碟上,需要的時候再調回記憶體,這樣就會增加運算時間。而cudaHostAlloc分配的是頁鎖定的(page-locked)主機記憶體,作業系統不會對這塊記憶體分頁和交換到磁碟上,確保該記憶體始終駐留在實體記憶體中。

下面通過100M資料在主機和裝置上的交換說明二者的差異。貼上程式碼:

/********************************************************************
*  PageLockedMem.cu
*  Compare the performance of general mem and page locked mem.
*********************************************************************/

#include <stdio.h>
#include <stdlib.h>
#include <cuda_runtime.h>
#include <cutil_inline.h>

#define _SIZE 100*1024*1024

/************************************************************************/
/* Init CUDA                                                            */
/************************************************************************/
bool InitCUDA(void)
{
    ......
}

float cudaMallocTest(int size, bool dir)
{
	cudaEvent_t start, stop;
	float elapsedTime;

	int *a, *dev_a;

	a = (int*)malloc(size*sizeof(int));
	if (!a)
	{
		printf("Mem error!\n");
	}
	cutilSafeCall(cudaMalloc((void**)&dev_a, size*sizeof(int)));

	cutilSafeCall(cudaEventCreate(&start));
	cutilSafeCall(cudaEventCreate(&stop));
	cutilSafeCall(cudaEventRecord(start, 0));

	for (int i=0; i<10; i++)
	{
		if (dir)
		{
			cutilSafeCall(cudaMemcpy(dev_a, a, size*sizeof(int), cudaMemcpyHostToDevice));
		}
		else
		{
			cutilSafeCall(cudaMemcpy(a, dev_a, size*sizeof(int), cudaMemcpyDeviceToHost));
		}
	}

	cutilSafeCall(cudaEventRecord(stop, 0));
	cudaEventSynchronize(stop);
	cutilSafeCall(cudaEventElapsedTime(&elapsedTime, start, stop));

	free(a);
	cutilSafeCall(cudaFree(dev_a));
	cutilSafeCall(cudaEventDestroy(start));
	cutilSafeCall(cudaEventDestroy(stop));

	return elapsedTime;
}

float cudaHostAllocTest(int size, bool dir)
{
	cudaEvent_t start, stop;
	float elapsedTime;

	int *a, *dev_a;

	cutilSafeCall(cudaHostAlloc((void**)&a, size*sizeof(int), cudaHostAllocDefault));
	cutilSafeCall(cudaMalloc((void**)&dev_a, size*sizeof(int)));

	cutilSafeCall(cudaEventCreate(&start));
	cutilSafeCall(cudaEventCreate(&stop));
	cutilSafeCall(cudaEventRecord(start, 0));

	for (int i=0; i<10; i++)
	{
		if (dir)
		{
			cutilSafeCall(cudaMemcpy(dev_a, a, size*sizeof(int), cudaMemcpyHostToDevice));
		}
		else
		{
			cutilSafeCall(cudaMemcpy(a, dev_a, size*sizeof(int), cudaMemcpyDeviceToHost));
		}
	}

	cutilSafeCall(cudaEventRecord(stop, 0));
	cudaEventSynchronize(stop);
	cutilSafeCall(cudaEventElapsedTime(&elapsedTime, start, stop));

	cutilSafeCall(cudaFreeHost(a));
	cutilSafeCall(cudaFree(dev_a));
	cutilSafeCall(cudaEventDestroy(start));
	cutilSafeCall(cudaEventDestroy(stop));

	return elapsedTime;
}



int main(int argc, char* argv[])
{

	if(!InitCUDA()) {
		return 0;
	}

	float elapsedTime;
	float MB = (float)100*_SIZE*sizeof(int)/1024/1024;

	elapsedTime = cudaMallocTest(_SIZE, true);

	printf("Time using cudaMalloc: %3.1f ms\n", elapsedTime);
	printf("\tMB/s during copy up: %3.1f \n", MB/(elapsedTime/1000));

	elapsedTime = cudaMallocTest(_SIZE, true);

	printf("Time using cudaMalloc: %3.1f ms\n", elapsedTime);
	printf("\tMB/s during copy down: %3.1f \n", MB/(elapsedTime/1000));

	elapsedTime = cudaHostAllocTest(_SIZE, true);

	printf("Time using cudaHostAlloc: %3.1f ms\n", elapsedTime);
	printf("\tMB/s during copy up: %3.1f \n", MB/(elapsedTime/1000));

	elapsedTime = cudaHostAllocTest(_SIZE, true);

	printf("Time using cudaHostAlloc: %3.1f ms\n", elapsedTime);
	printf("\tMB/s during copy down: %3.1f \n", MB/(elapsedTime/1000));
	return 0;
}

可以看出運算時間縮短了約2倍。

 

但是並不是所有的場合都適合用頁鎖定記憶體,因為使用固定記憶體時,將失去虛擬記憶體的所有功能,即需要為每個頁鎖定記憶體分配實體記憶體,系統將更快耗盡記憶體(跟使用普通記憶體相比)。所以要根據需要進行選擇。

相關推薦

[每天CUDA_C] 利用鎖定記憶體提高運算效率

本文通過使用malloc分配記憶體和cudaHostAlloc分配頁鎖定記憶體,說明使用頁鎖定記憶體可提高運算效率,並指出哪些場合適合使用頁鎖定記憶體。 malloc分配的是標準的可分頁的(pagable)的主機記憶體,作業系統在對記憶體進行排程的時候可能會將這種記憶體分頁

[每天CUDA_C]多GPU的使用

單個GPU具有強大的平行計算的能力,當把多個GPU同時用來執行同一個任務的時候,計算的效能將會得到更大的提升。本文在兩塊GPU上實現大資料量的向量點積運算。主要步驟為: 1.      獲得裝置數量; 2.      任務分配; 3.      為每個任務建立一個執行緒;

每天CUDA_C]多GPU的使用

單個GPU具有強大的平行計算的能力,當把多個GPU同時用來執行同一個任務的時候,計算的效能將會得到更大的提升。本文在兩塊GPU上實現大資料量的向量點積運算。主要步驟為:1. 獲得裝置數量;2. 任務分配;3. 為每個任

[每天CUDA_C]GPU實現水波動畫效果

本文利用GPU強大的計算能力生成不同時刻的水波圖片,並使用OpenGL繪製,實現水波動畫效果。其中幾個時刻的截圖如下: 生成一幀動畫的程式碼為: void generateFrame(DataBlock *d, int ticks) { dim3 blocks(DIM

利用localStorage事件跨標簽共享sessionStorage

sessions code oba dev rda locals 有效 lis html5 //幹貨 利用localStorage事件來跨標簽頁共享sessionStorage //因為cookie保存字節數量有限,很多童鞋考慮用html5 storage來保存臨時數據,

Java程式設計師從笨之(七十二)細談Spring(四)利用註解實現spring基本配置詳解

分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!http://blog.csdn.net/jiangjunshow 也歡迎大家轉載本篇文章。分享知識,造福人民,實現我們中華民族偉大復興!        

如何簡單高效地部署和監控分散式爬蟲專案?教你!

初級使用者: 只有一臺開發主機 能夠通過 Scrapyd-client 打包和部署 Scrapy 爬蟲專案,以及通過 Scrapyd JSON API 來控制爬蟲,感覺 命令列操作太麻煩 ,希望能夠通過瀏覽器直接部署和執行專案 專業使用者: 有

面試被當成,程式設計師:當場摘帽子,面試官:明天上班!

很多求職者,都有過面試的經歷,這個過程很讓人煎熬,因為面試前需要做很多準備,比如修改簡歷、準備面試內容,甚至還要思考面試時要怎麼穿著才得體。 雖然說光看外表並不能客觀的反映一個人的真實能力,但是面試官也會通過求職者的外形和裝扮來判斷他們的經驗和閱歷。 學習web前端找工作這裡推

前端——“一看就會的”教程首製作!

之前在複習網頁製作,仿照菜鳥教程的首頁寫了一個仿菜鳥首頁。效果如下:  製作網頁之前先佈局。原網頁如下: 分析該網站的佈局,我們可以發現,菜鳥教程的首頁主要有四個模組,分別是頂端,頂端導航, 左邊選單,右邊選單內容。 先在原網站檢視原始碼,找到相應模組的引數,根

HTML製作教程首

 成果圖如下所示: 雖然比起原網站要遜色的多,但是猛地一看還是很有迷惑性的。(哈哈)   1、首先對頁面用div進行佈局 (先分成幾個大塊)如圖: 2、然後在大塊裡面放上小塊,如圖 3、寫上文字: 4、加上圖片修改顏色,調整下位置,就得到如上的第

們注意了,看看大神們推薦的運維資料和書籍

對於有志成為運維工程師的在校學生,有哪些好的運維方面的好書或者資料推薦? 韓海剛,運維 苦練基本功 1. 熟悉windows、linux作業系統;作業系統原理是精髓。 2. sed、awk、grep等指令碼用法熟悉;正則表示式熟悉。 3. 常見系統在windows,linux下部署要熟悉。比如dns

看框架】——MVC+EF實現分

public static HtmlString ShowPageNavigate(this HtmlHelper htmlHelper, int currentPage, int pageSize, int totalCount) { var redirectTo =

C#編寫的區域網聊天工具(本剛學Socket,拿分享下~~~)

class Server //服務端方法 { #region 繫結IP、埠 IniOperate io = new IniOperate("C:\\lwj.ini"); public Socket Bind()

(動手)SpringMVC+Spring+Mybatis整合(第三天) SSM框架整合

前一段寫了前2天的內容,本來想一個框架一個框架網上增.後來發現不好整... 這次參考網上的文章,一次將3個框架整合到一起.記錄下來. 大體步驟: 1.新建maven web 專案 2.引入jar包 3.寫業務程式碼 4.配置檔案 5.測試 開始: 一: 1)第一步直接

之路 之 C# 通過特殊符號擷取每字串

因為有個專案,需要在記錄一段時間的一些資料,菜鳥嘛,也想不出什麼好的辦法來解決: 1、以時間為單位,往資料庫裡面寫入資料,每條記錄只記錄收集的一條資料; 2、在一條記錄中,一個欄位中寫入通過特殊字元

[新手教程] 教程:小編教大家怎麼壓縮圖片大小,們快學習啦~~~

很多網友發現有時候上傳圖片會失敗,或者上傳後不顯示。那是因為ZZZ4論壇限制了論壇附件不能超過1M的大小。但現在絕大部分相機拍出來的照片會超過這個大小。所以直接從相機匯出的圖片是不能上傳到線上的。     那麼ZZZ4為什麼要限制圖片大小呢?這裡我們來個小小知識普及吧

這個花幾個小時寫的 DEMO 被碼雲推薦上首

寫在最前     沒有接觸過 AntV 的諸位看客可通過這篇不成文的文章稍作了解。最近 病毒猖獗,遂抽空做了一個相關小 DEMO。資料視覺化方面的使用的是 AntV F2,前端框架使用 Vue 快速成型,使用與 Vue 配合較好的 Vant 最為UI框架以節約時間。此文以一個小小的示例(渲染能夠橫向滾動的圖表

這個花幾個小時寫的 DEMO 竟被碼雲推薦上首

寫在最前     沒有接觸過 AntV 的諸位看客可通過這篇不成文的文章稍作了解。最近 病毒猖獗,遂抽空做了一個相關小 DEMO。資料視覺化方面的使用的是 AntV F2,前端框架使用 Vue 快速成型,使用與 Vue 配合較好的 Vant 最為UI框架以節約時間。此文以一個小小的示例(渲染能夠橫向滾動的圖表

學習Dubbo

資源利用率 borde nco 發現 name 結果 ren 分布式架構 無法 一.什麽是dubbo? 隨著互聯網的不斷發展,網站的應用規模越來越大,常規的垂直架構已經無法應對,尤其是類似電商的項目,所以分布式架構和流動計算架構已經勢在必行。 ① 單一應用架構

老報道的

知識點 華為 會員 報名 課程 註冊51CTO會員有一段時間了,最近在學習HCNA課程,以前對網絡知識只是籠統的了解沒有具體詳細的學習,現在慢慢學習HCNA課程學習網絡基礎以及初步了解華為最初級認證需要理解的知識點以及基礎內容,為後期考試做一個全面的熟悉,後期學習起來就不會一頭霧水。加油吧