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 | |
1 | T |
2 | T.x + T.y * Dx |
3 | T.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應用(2):寫個python程式給自己用用python寫一個程式,然後在命令列上執行,看不到介面(UI),這種程式很常見了,叫命令列程式。然而很多人,特別是不懂程式的人,更需要看到的是一個有介面的,能通過滑鼠操作的程式,畢竟已經邁進“視窗”的時代,雖然Dos還存在。所以,怎麼用python弄出有介面的程式呢? 介面也是一個工具,所以,有沒有介面工 【CUDA並行程式設計系列(2)】CUDA簡介及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菜鳥快樂遊戲程式設計_pygame(2)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高階(一)——網路程式設計Socket(2)檔案下載案例1、伺服器 import socket def send_file_2_client(new_client_socket, client_addr): # 1 接收客戶端,需要下載的檔名 # 接收客戶端傳送來的請求 file_name = new_client_soc 淺入mybatis(2)(手寫簡單的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 |