日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

CUDA 7 流并发性优化

發(fā)布時(shí)間:2023/11/28 生活经验 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 CUDA 7 流并发性优化 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

CUDA 7 流并發(fā)性優(yōu)化

異構(gòu)計(jì)算是指高效地使用系統(tǒng)中的所有處理器,包括 CPU 和 GPU 。為此,應(yīng)用程序必須在多個(gè)處理器上并發(fā)執(zhí)行函數(shù)。 CUDA 應(yīng)用程序通過在 streams 中執(zhí)行異步命令來管理并發(fā)性,這些命令是按順序執(zhí)行的。不同的流可以并發(fā)地執(zhí)行它們的命令,也可以彼此無序地執(zhí)行它們的命令。

在不指定流的情況下執(zhí)行異步 CUDA 命令時(shí),runtime使用默認(rèn)流。在 CUDA 7 之前,默認(rèn)流是一個(gè)特殊流,它隱式地與設(shè)備上的所有其它流同步。

CUDA 7 引入了大量強(qiáng)大的新功能 ,包括一個(gè)新的選項(xiàng),可以為每個(gè)主機(jī)線程使用獨(dú)立的默認(rèn)流,這避免了傳統(tǒng)默認(rèn)流的序列化。本文將展示如何在 CUDA 程序中簡化實(shí)現(xiàn)內(nèi)核和數(shù)據(jù)副本之間的并發(fā)。

CUDA 中的異步命令

如 CUDA C 編程指南所述,異步命令在設(shè)備完成請求的任務(wù)之前將控制權(quán)返回給調(diào)用主機(jī)線程(非阻塞的)。這些命令是:

·
內(nèi)核啟動(dòng);

·
存儲器在兩個(gè)地址之間復(fù)制到同一設(shè)備存儲器;

·
從主機(jī)到設(shè)備的 64kb 或更少內(nèi)存塊的內(nèi)存拷貝;

·
由后綴為 Async 的函數(shù)執(zhí)行的內(nèi)存復(fù)制;

·
內(nèi)存設(shè)置函數(shù)調(diào)用。

為內(nèi)核啟動(dòng)或主機(jī)設(shè)備內(nèi)存復(fù)制指定流是可選的;可以調(diào)用 CUDA 命令而不指定流(或通過將 stream 參數(shù)設(shè)置為零)。下面兩行代碼都在默認(rèn)流上啟動(dòng)內(nèi)核。

kernel<<< blocks, threads, bytes >>>(); // default stream

kernel<<< blocks, threads, bytes, 0 >>>(); // stream 0

默認(rèn)流

在并發(fā)性對性能不重要的情況下,默認(rèn)流很有用。在 CUDA 7 之前,每個(gè)設(shè)備都有一個(gè)用于所有主機(jī)線程的默認(rèn)流,這會導(dǎo)致隱式同步。正如 CUDA C 編程指南中的“隱式同步”一節(jié)所述,如果主機(jī)線程向它們之間的默認(rèn)流發(fā)出任何 CUDA 命令,來自不同流的兩個(gè)命令就不能并發(fā)運(yùn)行。

CUDA 7 引入了一個(gè)新選項(xiàng),每線程默認(rèn)流 ,它有兩個(gè)效果。首先,它為每個(gè)主機(jī)線程提供自己的默認(rèn)流。這意味著不同主機(jī)線程向默認(rèn)流發(fā)出的命令可以并發(fā)運(yùn)行。其次,這些默認(rèn)流是常規(guī)流。這意味著默認(rèn)流中的命令可以與非默認(rèn)流中的命令同時(shí)運(yùn)行。

要在 nvcc 7 及更高版本中啟用每線程默認(rèn)流,可以在包含 CUDA 頭( cuda.h 或 cuda_runtime.h )之前,使用 nvcc 命令行選項(xiàng) CUDA 或 #define 編譯 CUDA_API_PER_THREAD_DEFAULT_STREAM 預(yù)處理器宏。需要注意的是:當(dāng)代碼由 nvcc 編譯時(shí),不能使用 #define
CUDA_API_PER_THREAD_DEFAULT_STREAM 在. cu 文件中啟用此行為,因?yàn)?nvcc 在翻譯單元的頂部隱式包含了 cuda_runtime.h 。

多流示例

看一個(gè)小例子。下面的代碼簡單地在八個(gè)流上啟動(dòng)一個(gè)簡單內(nèi)核的八個(gè)副本。只為每個(gè)網(wǎng)格啟動(dòng)一個(gè)線程塊,就有足夠的資源同時(shí)運(yùn)行多個(gè)線程塊。默認(rèn)流如何導(dǎo)致序列化的示例,在默認(rèn)流上添加了不起作用的虛擬內(nèi)核啟動(dòng)。這是密碼。

const int N = 1 << 20;

global void kernel(float *x, int n)

{

int tid = threadIdx.x + blockIdx.x * blockDim.x;

for (int i = tid; i < n; i += blockDim.x * gridDim.x) {

x[i] = sqrt(pow(3.14159,i));

}

}

int main()

{

const int num_streams = 8;

cudaStream_t streams[num_streams];

float *data[num_streams];

for (int i = 0; i < num_streams; i++) {

cudaStreamCreate(&streams[i]);

cudaMalloc(&data[i], N * sizeof(float));

// launch one worker kernel per stream

kernel<<<1, 64, 0, streams[i]>>>(data[i], N);

// launch a dummy kernel on the default stream

kernel<<<1, 1>>>(0, 0);

}

cudaDeviceReset();

return 0;

}

首先檢查遺留行為,通過不帶選項(xiàng)的編譯。

nvcc ./stream_test.cu -o stream_legacy

可以在 NVIDIA visualprofiler ( nvvp )中運(yùn)行該程序,以獲得顯示所有流和內(nèi)核啟動(dòng)的時(shí)間軸。圖 1 顯示了 Macbook Pro 上生成的內(nèi)核時(shí)間線,該 Macbook Pro 帶有 NVIDIA GeForce GT 750M (一臺開普勒 GPU )??梢钥吹侥J(rèn)流上虛擬內(nèi)核的非常小,以及它們?nèi)绾螌?dǎo)致所有其他流序列化。

一個(gè)簡單的多流示例在將任何交錯(cuò)內(nèi)核發(fā)送到默認(rèn)流時(shí)不會實(shí)現(xiàn)并發(fā)。

現(xiàn)在嘗試新的單線程默認(rèn)流。

nvcc --default-stream per-thread ./stream_test.cu -o stream_per-thread

圖 2 顯示了來自 nvvp 的結(jié)果??梢钥吹骄艂€(gè)流之間的完全并發(fā):默認(rèn)流(在本例中映射到流 14 )和創(chuàng)建的其它八個(gè)流。虛擬內(nèi)核運(yùn)行得如此之快,以至于很難看到在這個(gè)圖像中默認(rèn)流上有八個(gè)調(diào)用。

圖 2 :使用新的每線程默認(rèn)流選項(xiàng)的多流示例,它支持完全并發(fā)執(zhí)行。

多線程示例

來看另一個(gè)例子,該示例旨在演示新的默認(rèn)流行為如何使多線程應(yīng)用程序,更容易實(shí)現(xiàn)執(zhí)行并發(fā)。下面的例子創(chuàng)建了八個(gè) POSIX 線程,每個(gè)線程在默認(rèn)流上調(diào)用內(nèi)核,然后同步默認(rèn)流。(需要在本例中進(jìn)行同步,以確保探查器在程序退出之前獲得內(nèi)核開始和結(jié)束時(shí)間戳。)

#include <pthread.h>

#include <stdio.h>

const int N = 1 << 20;

global void kernel(float *x, int n)

{

int tid = threadIdx.x + blockIdx.x * blockDim.x;

for (int i = tid; i < n; i += blockDim.x * gridDim.x) {

x[i] = sqrt(pow(3.14159,i));

}

}

void *launch_kernel(void *dummy)

{

float *data;

cudaMalloc(&data, N * sizeof(float));

kernel<<<1, 64>>>(data, N);

cudaStreamSynchronize(0);

return NULL;

}

int main()

{

const int num_threads = 8;

pthread_t threads[num_threads];

for (int i = 0; i < num_threads; i++) {

if (pthread_create(&threads[i], NULL, launch_kernel, 0)) {

        fprintf(stderr, "Error

creating threadn");

        return 1;

}

}

for (int i = 0; i < num_threads; i++) {

if(pthread_join(threads[i], NULL)) {

        fprintf(stderr, "Error joining

threadn");

        return 2;

}

}

cudaDeviceReset();

return 0;

}

首先,編譯時(shí)不使用任何選項(xiàng)來測試遺留的默認(rèn)流行為。

nvcc ./pthread_test.cu -o pthreads_legacy

在 nvvp 中運(yùn)行它時(shí),看到一個(gè)流,默認(rèn)流,所有內(nèi)核啟動(dòng)都序列化,如圖 3 所示。

圖 3 :一個(gè)具有默認(rèn)流行為的多線程示例:所有八個(gè)線程都被序列化。

用新的 per-thread default stream 選項(xiàng)編譯它。

nvcc --default-stream per-thread ./pthread_test.cu -o pthreads_per_thread

圖 4 顯示,對于每個(gè)線程的默認(rèn)流,每個(gè)線程都會自動(dòng)創(chuàng)建一個(gè)新的流,它們不會同步,因此所有八個(gè)線程的內(nèi)核都會并發(fā)運(yùn)行。

圖 4 :單線程默認(rèn)流的多線程示例:所有八個(gè)線程的內(nèi)核同時(shí)運(yùn)行。

注意

在為并發(fā)進(jìn)行編程時(shí),還需要記住以下幾點(diǎn)。

·
記住:對于每線程的默認(rèn)流,每個(gè)線程中的默認(rèn)流的行為與常規(guī)流相同,只要同步和并發(fā)就可以了。對于傳統(tǒng)的默認(rèn)流,這是不正確的。

·
–default-stream 選項(xiàng)是按編譯單元應(yīng)用的,確保將其應(yīng)用于所有需要它的 nvcc 命令行。

·
cudaDeviceSynchronize() 繼續(xù)同步設(shè)備上的所有內(nèi)容,甚至使用新的每線程默認(rèn)流選項(xiàng)。如果只想同步單個(gè)流,請使用 cudaStreamSynchronize(cudaStream_t stream) ,如第二個(gè)示例所示。

· 從 CUDA 7 開始,還可以使用句柄 cudaStreamPerThread 顯式地訪問每線程的默認(rèn)流,也可以使用句柄 cudaStreamLegacy 訪問舊的默認(rèn)流。請注意, cudaStreamLegacy 仍然隱式地與每個(gè)線程的默認(rèn)流同步,如果碰巧在一個(gè)程序中混合使用它們。

· 可以通過將 cudaStreamCreate() 標(biāo)志傳遞給 cudaStreamCreate() 來創(chuàng)建不與傳統(tǒng)默認(rèn)流同步的 非阻塞流。

總結(jié)

以上是生活随笔為你收集整理的CUDA 7 流并发性优化的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 国产小视频在线播放 | 性欧美在线视频观看 | 欧美脚交视频 | 亚洲精品色午夜无码专区日韩 | 欧美激情一区二区三区蜜桃视频 | 中文字幕激情视频 | 黄色网址哪里有 | 自拍偷拍欧美激情 | 动漫精品一区二区三区 | 日韩精品久久久 | 日韩mv欧美mv国产网站 | a国产免费 | 毛片其地| 亚洲精品一区二区三区四区五区 | 潮喷失禁大喷水无码 | 欧美性生活在线视频 | 在线超碰| 午夜国产视频 | 色91| 国产操视频 | 久草欧美| h网站免费在线观看 | 伊人久久大香网 | 国产69久久精品成人看 | 欧美嘿咻视频 | 国产亚洲成人av | 日韩精品四区 | 亚洲三级伦理 | 免费在线视频一区 | 亚洲AV无码国产精品 | 中文字幕日韩高清 | 欧美操女人 | 麻豆蜜臀| 国产一区二区麻豆 | 日韩在线观看视频一区二区 | 日本国产精品一区 | 最新av网址在线观看 | 国产三级第一页 | free性娇小hd第一次 | 久久久久久9| 久久无码视频网站 | 成人黄色小视频 | 奇米影视一区二区 | 日本a在线免费观看 | 自拍视频在线 | 日韩免费看片 | 熟妇人妻无乱码中文字幕真矢织江 | 寡妇av| 精品伦精品一区二区三区视频 | 日本久久精品视频 | 国产精品欧美综合亚洲 | 136福利视频导航 | 姐姐你真棒插曲快来救救我电影 | 九九视屏 | 日韩啊v| 黄色成人在线观看 | 一级黄色片免费观看 | 国产又色又爽无遮挡免费动态图 | 天天干人人干 | 国产高清精品软件丝瓜软件 | 中文字幕人妻一区二区三区 | 日本三级午夜理伦三级三 | 日本少妇一级片 | 色噜噜狠狠狠综合曰曰曰 | 中文字幕在线乱 | 国产精品30p | 国产精品久久久久久久久久直播 | 永久av在线免费观看 | 熟女高潮一区二区三区 | 四川操bbb | 亚洲精品视频观看 | 亚洲精品在线视频免费观看 | 6699嫩草久久久精品影院 | 岛国av一区二区 | 久久中文在线 | 久久九九免费 | 精品一区二区欧美 | 国产性猛交 | 禁断介护av一区二区 | 在线久 | 暖暖成人免费视频 | 丰满肥臀噗嗤啊x99av | a级片在线 | 午夜肉伦伦影院 | 中文字幕网址在线 | 成人网免费看 | 四虎永久在线精品免费网址 | 西西人体高清44rt·net | 99久久精品国产一区色 | 日韩av看片 | 色资源av | 国产色图视频 | 九色蝌蚪9l视频蝌蚪9l视频 | 亚欧中文字幕 | 天堂成人av | 91精品免费在线观看 | 日日干天天射 | 性做久久久久久免费观看欧美 | 国产精品一区二区免费视频 |