chinese直男口爆体育生外卖, 99久久er热在这里只有精品99, 又色又爽又黄18禁美女裸身无遮挡, gogogo高清免费观看日本电视,私密按摩师高清版在线,人妻视频毛茸茸,91论坛 兴趣闲谈,欧美 亚洲 精品 8区,国产精品久久久久精品免费

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何在CUDA程序中簡(jiǎn)化內(nèi)核和數(shù)據(jù)副本的并發(fā)

星星科技指導(dǎo)員 ? 來(lái)源:NVIDIA ? 作者:Mark Harris ? 2022-04-11 09:26 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

異構(gòu)計(jì)算是指高效地使用系統(tǒng)中的所有處理器,包括 CPUGPU 。為此,應(yīng)用程序必須在多個(gè)處理器上并發(fā)執(zhí)行函數(shù)。 CUDA 應(yīng)用程序通過(guò)在 streams 中執(zhí)行異步命令來(lái)管理并發(fā)性,這些命令是按順序執(zhí)行的。不同的流可以并發(fā)地執(zhí)行它們的命令,也可以彼此無(wú)序地執(zhí)行它們的命令。[見帖子[See the post 如何在 CUDA C / C ++中實(shí)現(xiàn)數(shù)據(jù)傳輸?shù)闹丿B ]

在不指定流的情況下執(zhí)行異步 CUDA 命令時(shí),運(yùn)行時(shí)使用默認(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 程序中簡(jiǎn)化實(shí)現(xiàn)內(nèi)核和數(shù)據(jù)副本之間的并發(fā)。

CUDA 中的異步命令

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

  • 內(nèi)核啟動(dòng);
  • 存儲(chǔ)器在兩個(gè)地址之間復(fù)制到同一設(shè)備存儲(chǔ)器;
  • 從主機(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 命令而不指定流(或通過(guò)將 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ā)性對(duì)性能不重要的情況下,默認(rèn)流很有用。在 CUDA 7 之前,每個(gè)設(shè)備都有一個(gè)用于所有主機(jī)線程的默認(rèn)流,這會(huì)導(dǎo)致隱式同步。正如 CUDA C 編程指南中的“隱式同步”一節(jié)所述,如果主機(jī)線程向它們之間的默認(rèn)流發(fā)出任何 CUDA 命令,來(lái)自不同流的兩個(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è)小例子。下面的代碼簡(jiǎn)單地在八個(gè)流上啟動(dòng)一個(gè)簡(jiǎn)單內(nèi)核的八個(gè)副本。我們只為每個(gè)網(wǎng)格啟動(dòng)一個(gè)線程塊,這樣就有足夠的資源同時(shí)運(yùn)行多個(gè)線程塊。作為遺留默認(rèn)流如何導(dǎo)致序列化的示例,我們?cè)谀J(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;
}

首先讓我們檢查遺留行為,通過(guò)不帶選項(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 (一臺(tái)開普勒 GPU )。您可以看到默認(rèn)流上虛擬內(nèi)核的非常小的條,以及它們?nèi)绾螌?dǎo)致所有其他流序列化。

現(xiàn)在讓我們嘗試新的每線程默認(rèn)流。

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

圖 2 顯示了來(lái)自nvvp的結(jié)果。在這里您可以看到九個(gè)流之間的完全并發(fā):默認(rèn)流(在本例中映射到流 14 )和我們創(chuàng)建的其他八個(gè)流。請(qǐng)注意,虛擬內(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 
#include 

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)來(lái)測(cè)試遺留的默認(rèn)流行為。

nvcc ./pthread_test.cu -o pthreads_legacy

當(dāng)我們?cè)?code style="font-size:inherit;color:inherit;margin:0px;padding:0px;border:0px;font-style:inherit;font-variant:inherit;font-weight:inherit;line-height:inherit;vertical-align:baseline;background-color:rgb(244,244,244);">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 顯示,對(duì)于每個(gè)線程的默認(rèn)流,每個(gè)線程都會(huì)自動(dòng)創(chuàng)建一個(gè)新的流,它們不會(huì)同步,因此所有八個(gè)線程的內(nèi)核都會(huì)并發(fā)運(yùn)行。

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

更多提示

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

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

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

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

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

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

關(guān)于作者

Mark Harris 是 NVIDIA 杰出的工程師,致力于 RAPIDS 。 Mark 擁有超過(guò) 20 年的 GPUs 軟件開發(fā)經(jīng)驗(yàn),從圖形和游戲到基于物理的模擬,到并行算法和高性能計(jì)算。當(dāng)他還是北卡羅來(lái)納大學(xué)的博士生時(shí),他意識(shí)到了一種新生的趨勢(shì),并為此創(chuàng)造了一個(gè)名字: GPGPU (圖形處理單元上的通用計(jì)算)。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 處理器
    +關(guān)注

    關(guān)注

    68

    文章

    19896

    瀏覽量

    235255
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    11080

    瀏覽量

    217102
  • gpu
    gpu
    +關(guān)注

    關(guān)注

    28

    文章

    4948

    瀏覽量

    131250
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    通用型上位機(jī),支持串口、UDP、TCP,可以在表格自由編輯公式和數(shù)據(jù),可以組態(tài)

    本帖最后由 jf_43406447 于 2025-7-18 16:49 編輯 本上位機(jī)軟件是用于與下位機(jī)(如嵌入式設(shè)備、機(jī)器人、傳感器等)進(jìn)行通信和數(shù)據(jù)交換的計(jì)算機(jī)程序。具備數(shù)據(jù)采集、分析
    發(fā)表于 07-17 14:58

    何在 樹莓派 上編寫和運(yùn)行 C 語(yǔ)言程序?

    在本教程,我將討論C編程語(yǔ)言是什么,C編程的用途,以及如何在RaspberryPi上編寫和運(yùn)行C程序。本文的目的是為您介紹在RaspberryPi上進(jìn)行C編程的基礎(chǔ)知識(shí)。如果您想深入了解C編程
    的頭像 發(fā)表于 03-25 09:28 ?572次閱讀
    如<b class='flag-5'>何在</b> 樹莓派 上編寫和運(yùn)行 C 語(yǔ)言<b class='flag-5'>程序</b>?

    零基礎(chǔ)入門:如何在樹莓派上編寫和運(yùn)行Python程序

    在這篇文章,我將為你簡(jiǎn)要介紹Python程序是什么、Python程序可以用來(lái)做什么,以及如何在RaspberryPi上編寫和運(yùn)行一個(gè)簡(jiǎn)單的Python
    的頭像 發(fā)表于 03-25 09:27 ?741次閱讀
    零基礎(chǔ)入門:如<b class='flag-5'>何在</b>樹莓派上編寫和運(yùn)行Python<b class='flag-5'>程序</b>?

    在imx93,如何在flexio引腳模擬spi功能?

    何在 flexio 引腳模擬 spi 功能?我看到了實(shí)現(xiàn) I2C 的文檔,但沒有看到 SPI 的文檔。也搜索了內(nèi)核。誰(shuí)能提供任何文檔或示例來(lái)開始仿真 SPI?
    發(fā)表于 03-21 06:59

    何在SonarWiz中導(dǎo)入和處理磁強(qiáng)計(jì)數(shù)據(jù)

    本指南將向您介紹如何在 SonarWiz 中導(dǎo)入和處理磁強(qiáng)計(jì)數(shù)據(jù)。 我們概述的程序將減少數(shù)據(jù)的晝夜變化和航向變化,消除層回偏移,并生成總場(chǎng)
    的頭像 發(fā)表于 02-17 17:29 ?410次閱讀
    如<b class='flag-5'>何在</b>SonarWiz中導(dǎo)入和處理磁強(qiáng)計(jì)<b class='flag-5'>數(shù)據(jù)</b>

    EE-132:使用VisualDSP將C代碼和數(shù)據(jù)模塊放入SHARC存儲(chǔ)器

    電子發(fā)燒友網(wǎng)站提供《EE-132:使用VisualDSP將C代碼和數(shù)據(jù)模塊放入SHARC存儲(chǔ)器.pdf》資料免費(fèi)下載
    發(fā)表于 01-07 13:55 ?0次下載
    EE-132:使用VisualDSP將C代碼<b class='flag-5'>和數(shù)據(jù)</b>模塊放入SHARC存儲(chǔ)器<b class='flag-5'>中</b>

    VSS在數(shù)據(jù)備份的作用 VSS技術(shù)的優(yōu)勢(shì)與劣勢(shì)

    的一項(xiàng)服務(wù),它允許用戶創(chuàng)建文件和文件系統(tǒng)的快照,即影子副本。這些快照可以用于數(shù)據(jù)備份、恢復(fù)和分析,而不需要中斷當(dāng)前的文件系統(tǒng)操作。 2. VSS在數(shù)據(jù)備份的作用 一致性備份 :VSS
    的頭像 發(fā)表于 12-13 16:03 ?1015次閱讀

    linux內(nèi)核通用HID觸摸驅(qū)動(dòng)

    在linux內(nèi)核,為HID觸摸面板實(shí)現(xiàn)了一個(gè)通用的驅(qū)動(dòng)程序,位于/drivers/hid/hid-multitouch.c文件。hid觸摸驅(qū)動(dòng)是以struct hid_driver
    的頭像 發(fā)表于 10-29 10:55 ?2334次閱讀
    linux<b class='flag-5'>內(nèi)核</b><b class='flag-5'>中</b>通用HID觸摸驅(qū)動(dòng)

    行業(yè)動(dòng)態(tài) | 英偉達(dá)2024年將出貨10億個(gè)RISC-V 內(nèi)核

    據(jù)Tomshardware援引@NickBrownHPC的爆料稱,盡管英偉達(dá)(NVIDIA)的GPU依賴于其專有的CUDA內(nèi)核,這些內(nèi)核具有其指令集架構(gòu)并支持各種數(shù)據(jù)格式。但是在本月的
    的頭像 發(fā)表于 10-29 08:07 ?717次閱讀
    行業(yè)動(dòng)態(tài) | 英偉達(dá)2024年將出貨10億個(gè)RISC-V <b class='flag-5'>內(nèi)核</b>

    linux驅(qū)動(dòng)程序如何加載進(jìn)內(nèi)核

    在Linux系統(tǒng),驅(qū)動(dòng)程序內(nèi)核與硬件設(shè)備之間的橋梁。它們?cè)试S內(nèi)核與硬件設(shè)備進(jìn)行通信,從而實(shí)現(xiàn)對(duì)硬件設(shè)備的控制和管理。 驅(qū)動(dòng)程序的編寫 驅(qū)
    的頭像 發(fā)表于 08-30 15:02 ?1102次閱讀

    IB Verbs和NVIDIA DOCA GPUNetIO性能測(cè)試

    Async 等技術(shù),能夠創(chuàng)建以 GPU 為中心的應(yīng)用程序,其中 CUDA 內(nèi)核可以直接與網(wǎng)卡(NIC)通信,從而繞過(guò) CPU 發(fā)送和接收數(shù)據(jù)包,并將 CPU 排除在關(guān)鍵路徑之外。
    的頭像 發(fā)表于 08-23 17:03 ?1362次閱讀
    IB Verbs和NVIDIA DOCA GPUNetIO性能測(cè)試

    并發(fā)物聯(lián)網(wǎng)云平臺(tái)是什么

    并發(fā)物聯(lián)網(wǎng)云平臺(tái)是一種能夠處理大量設(shè)備同時(shí)連接并進(jìn)行數(shù)據(jù)交換的云計(jì)算平臺(tái)。這種平臺(tái)通常被設(shè)計(jì)用來(lái)應(yīng)對(duì)來(lái)自數(shù)以萬(wàn)計(jì)甚至數(shù)十億計(jì)的物聯(lián)網(wǎng)設(shè)備的并發(fā)請(qǐng)求,保證系統(tǒng)的穩(wěn)定性和響應(yīng)速度。 首先,從技術(shù)層面
    的頭像 發(fā)表于 08-13 13:50 ?549次閱讀

    內(nèi)核程序漏洞介紹

    電子發(fā)燒友網(wǎng)站提供《內(nèi)核程序漏洞介紹.pdf》資料免費(fèi)下載
    發(fā)表于 08-12 09:38 ?0次下載

    并發(fā)系統(tǒng)的藝術(shù):如何在流量洪峰中游刃有余

    前言 我們常說(shuō)的三高,高并發(fā)、高可用、高性能,這些技術(shù)是構(gòu)建現(xiàn)代互聯(lián)網(wǎng)應(yīng)用程序所必需的。對(duì)于京東618備戰(zhàn)來(lái)說(shuō),所有的臺(tái)系統(tǒng)服務(wù),無(wú)疑都是圍繞著三高來(lái)展開的。而對(duì)于京東龐大的客戶群體,高并發(fā)
    的頭像 發(fā)表于 08-05 13:43 ?522次閱讀
    高<b class='flag-5'>并發(fā)</b>系統(tǒng)的藝術(shù):如<b class='flag-5'>何在</b>流量洪峰中游刃有余

    打破英偉達(dá)CUDA壁壘?AMD顯卡現(xiàn)在也能無(wú)縫適配CUDA

    電子發(fā)燒友網(wǎng)報(bào)道(文/梁浩斌)一直以來(lái),圍繞CUDA打造的軟件生態(tài),是英偉達(dá)在GPU領(lǐng)域最大的護(hù)城河,尤其是隨著目前AI領(lǐng)域的發(fā)展加速,市場(chǎng)火爆,英偉達(dá)GPU+CUDA的開發(fā)生態(tài)則更加穩(wěn)固,AMD
    的頭像 發(fā)表于 07-19 00:16 ?5951次閱讀