1. 程式人生 > >CUDA程式設計-(2)其實寫個矩陣相乘並不是那麼難

CUDA程式設計-(2)其實寫個矩陣相乘並不是那麼難

程式程式碼及圖解析:

123456789101112131415161718#include <iostream>#include "book.h"__global__ void add( int a, int b, int *c ) {    *c = a + b;}int main( void ) {    int c;    int *dev_c;    HANDLE_ERROR( cudaMalloc( (void**)&dev_c, sizeof(int) ) );    add<<<1,1>>>( 2, 7, dev_c );    HANDLE_ERROR( cudaMemcpy( &c,
        dev_c,        sizeof(int),        cudaMemcpyDeviceToHost ) );    printf"2 + 7 = %d\n", c );    cudaFree( dev_c );    return 0;}

函式原型:__host__cudaError_t cudaMemcpy (void *dst, const void *src, size_t count, cudaMemcpyKind kind)

作用:在裝置端和主機端拷貝資料。

引數:dst 目的地址 src 源地址 count 拷貝位元組大小kind 傳輸的型別

返回值:

cudaSuccess, cudaErrorInvalidValue, cudaErrorInvalidDevicePointer, cudaErrorInvalidMemcpyDirection

說明:

從源地址拷貝設定數量的位元組數至目的地址,kind型別有四種,分別為:

cudaMemcpyHostToHost, cudaMemcpyHostToDevice,  cudaMemcpyDeviceToHost, cudaMemcpyDeviceToDevice,

通過指定方向進行拷貝。儲存器區域不可重疊。如若產生未定義拷貝方向的行為,dst和src將不匹配。

 正文

前面的圖是最簡單的一個CUDA程式,它引出了Grid Block Thread概念。很多threads組成1維,2維or3維的thread block. 為了標記thread在block中的位置(index),我們可以用上面講的threadIdx。threadIdx是一個維度<=3的vector。還可以用thread index(一個標量)表示這個位置。

thread的index與threadIdx的關係:

Thread index
1T
2T.x + T.y * Dx
3T.x+T.y*Dx+z*Dx*Dy

其中T表示變數threadIdx。(Dx, Dy, Dz)為block的size(每一維有多少threads)。

因為一個block內的所有threads會在同一處理器核心上共享記憶體資源,所以block內有多少threads是有限制的。目前GPU限制每個 block最多有1024個threads。但是一個kernel可以在多個相同shape的block上執行,效果等效於在一個有N*#thread per block個thread的block上執行。

Block又被組織成grid。同樣,grid中block也可以被組織成1維,2維or3維。一個grid中的block數量由系統中處理器個數或待處理的資料量決定。(來自這裡)

 下圖中描述了Thread、Block、Grid記憶體的訪問機制。

每個thread有自己的local-memory。每一個block有自己的共享記憶體、grid和grid之間可以同時訪問全域性記憶體。這裡要注意:block和block之間不能訪問同一個共享記憶體,他們只能訪問自己的共享記憶體。

cudaGetDeviceCount( &count )查詢伺服器的CUDA資訊.

1234567891011121314#include <stdio.h>#include <cuda_runtime.h>int main(){int deviceCount;cudaGetDeviceCount(&deviceCount);int device;for(device = 0; device < deviceCount; ++device){cudaDeviceProp deviceProp;cudaGetDeviceProperties(&deviceProp,device);printf("Device %d has compute capability %d.%d.\n",device,deviceProp.major,deviceProp.minor);}}

結果:

123456789101112131415161718192021222324252627

相關推薦

CUDA程式設計2其實矩陣相乘並不那麼

程式程式碼及圖解析:123456789101112131415161718#include <iostream>#include "book.h"__global__ void add( int a, int b, int *c ) {    *c = a + b

python應用2python程式給自己用

用python寫一個程式,然後在命令列上執行,看不到介面(UI),這種程式很常見了,叫命令列程式。然而很多人,特別是不懂程式的人,更需要看到的是一個有介面的,能通過滑鼠操作的程式,畢竟已經邁進“視窗”的時代,雖然Dos還存在。所以,怎麼用python弄出有介面的程式呢? 介面也是一個工具,所以,有沒有介面工

CUDA並行程式設計系列2CUDA簡介及CUDA初步程式設計

前言 CUDA並行程式設計系列是本人在學習CUDA時整理的資料,內容大都來源於對《CUDA並行程式設計:GPU程式設計指南》、《GPU高效能程式設計CUDA實戰》和CUDA Toolkit Documentation的整理。通過本系列整體介紹CUDA並行程式設

NMI, FIQ 與arm構架那點事2

微信公眾號 mindshare思享   以下內容會談到: 1.   NMI的使用場景。 2.   在arm上怎麼模擬NMI a.   通過GIC的中斷優先順序模擬 b

Python菜鳥快樂遊戲程式設計_pygame2

Python菜鳥快樂遊戲程式設計_pygame(博主錄製,2K解析度,超高清) https://study.163.com/course/courseMain.htm?courseId=1006188025&share=2&shareId=400000000398149  

Java程式設計思想2

第6章 訪問許可權控制 1 訪問許可權控制的等級,從最大許可權到最小許可權依次為:public,protected,包訪問許可權(沒有關鍵字)和private 2 如果想要使用類,可以在import語句中匯入該類或使用該類的全名來指定 // 使用ArrayList的一種方法是使用其全名j

CUDA學習筆記2- 執行緒並行和塊並行

1. 獲取顯示卡裝置資訊 有些顯示卡支援CUDA有些不支援,那麼如何確定主機的顯示卡裝置是否支援CUDA呢。可以使用下面的函式獲取顯示卡的相關資訊。 cudaError_t cudaGetDeviceCount(int *count) 獲取支援CUD

python高階——網路程式設計Socket2檔案下載案例

1、伺服器 import socket def send_file_2_client(new_client_socket, client_addr): # 1 接收客戶端,需要下載的檔名 # 接收客戶端傳送來的請求 file_name = new_client_soc

淺入mybatis2(手簡單的mybatis)

淺入mybatis(1)中 我們已經完整的配置了mybatis過程。可以實現通過簡單的xml檔案就實現了資料庫的增刪改查,那麼神奇之處 在哪裡呢?這一章我們簡單的實現下mybatis的實現原理,不足之處 敬請諒解   首先我個人手寫的一個流程圖如下 (我們可以先敲程式碼 

經典邏輯程式設計2

判斷101-200之間有多少個素數,並輸出所有素數。 public class sushu { //宣告靜態全域性變數 private static int s =0; public static void main(String[] a

Air202學習2底層韌體

1、準備工作 一個Air202 S6核心板 一根USB-TTL資料線(要支援921600波特率,如果不支援的話請在合宙旗艦店買一根,點選進入某寶) 2、開啟LuaTools工具,連線Air和電腦 模組開機後顯示上圖資訊。 3、下載官方韌體 按如圖所示步

web服務程式設計探索2——外掛模型

一、模型圖 該模型是自己摸索出來的一種web服務設計模型,整個圍繞核心業務邏輯處理模組進行。在這個模型中,core業務邏輯處理中心處理負責執行所有邏輯處理流程,該模組所需要的所有副作用操作都以“外掛”的形式從引數中傳入。而所謂的“外掛”,其實就是一些處理副

Java圖形程式設計學習2對JFrame的使用

目錄 1、頂層視窗類(框架)JFrame 2、 在框架中顯示資訊 3、繪製2D圖形 4、設定顏色 5、文字使用特殊字型 1、頂層視窗類(框架)JFrame (1)JFrame類是用於描述頂層視窗,JFrame就代表Swing中的視窗元件 (2)JFrame的

p166 搬寢室 注意list的下標是從1開始的,1在sort的時候2狀態轉移公式的時候

我跟書上寫的不一樣,但是我的可以過,好理解。。#include <stdio.h> #include <string.h> #include <iostream> #include <algorithm> #include &l

阿里2015實習生招聘前端方向--程式設計2

我的程式碼: function parseQueryString(input){ var query = input.split("?")[1].split("&"); var

高階Bash指令碼程式設計指南2:帶著一個Sha-Bang出發

特別說明,Sha-Bang 指的是 ( #! ) 。 在一個最簡單的例子中,一個shell指令碼其實就是將一堆系統命令列在一個檔案中。它的最基本的用處就是,在你每次輸入特定順序的命令時,可以少敲一些字。 以清除/var/log下的某些log檔案的指令碼為例:

C++11併發/多執行緒程式設計系列2

std::thread詳解 std::thread在標頭檔案<thread>中宣告,因此使用 std::thread 時需要包含 <thread>標頭檔案。 default(1) thread() noexcept;

MySQL資料分析2資料庫的底層邏輯

(一) 資料庫存在的邏輯 1.案例開篇-大部分公司對於資料和數字的管理都是低效率的 我們要學習資料庫,就必須要搞清楚資料庫是在什麼樣的情景下發明並流行的?學習新知識就要搞清楚每個知識點的來

第十四章 程式設計練習2

程式設計練習4 //Person.h #ifndef PERSON_H_ #define PERSON_H_ #include <string> #include <iostream> class Person { private

shell腳本學習2比較兩數字大小

$1 num centos7 錯誤 you equal shel 腳本 語句 註意:shell中對比字符串只能使用==、<、>、!=、-z、-n。對比字符串時,末尾一定要加上x(或者a、b等)一個字符,因為if [ $1x == "ab"x ]時如果沒有了x