cuda程式設計 c 使用Go和C輕鬆進行CUDA程式設計

2021-10-07 23:39:58 字數 2038 閱讀 5547

cuda程式設計 c

與其他語言相比,使用go程式設計cuda有點複雜。 儘管有一些出色的軟體包,例如mumax,但是文件很差,缺少示例並且很難使用。

cuda用於c語言,所以最好的選擇是使用command cgo並使用您的cuda核心呼叫外部函式。 這就是我在此示例中所做的事情,在該示例中,我使用cuda將兩個矩陣相乘。

。 我建立了乙個簡單的核心,該核心具有核心功能和可在外部呼叫的輔助功能。 請注意,我使用了extern c,因為這是cgo呼叫函式的方式:

# include

# include

__ global__ void vecmul ( float *a, float * b, float *c, int size)

}

vecmul()函式是核心,maxmul()函式是助手。 它的功能是在gpu中分配記憶體,複製引數,呼叫核心並複製結果。 值通過引用傳遞。

程式maxmul.go呼叫helper函式並顯示結果:

package main

/*void maxmul(float *a, float* b, float *c, int size);

#cgo ldflags: -l. -l./ -lmaxmul

*/import "c"

import "fmt"

func maxmul (a c.float, b c.float, c c.float, size int )

func main ()

// c 1.230000 4.560000

a := c.float

b := c.float

var c c.float = make (c.float, 9 )

maxmul(a,b,c, 3 )

fmt.println(c)

}

在匯入允許使用純c**(外部c)呼叫外部函式的c程式包之前,我傳遞了cgo的配置,指示函式c的原型,lib的路徑及其名稱。

我必須在go**中建立包裝函式,以呼叫外部函式以使事情變得更容易。 它只是將引用傳遞給陣列(第乙個位置的位址)和陣列大小(在這種情況下為3x3 = 9)。 在cuda中,我們處理平面矩陣。

我使用c.float型別建立了包含我的陣列的切片**換為向量)。 然後我呼叫了該函式。 請注意,我傳遞了每行(或列)的大小。

要編譯c**,請使用以下命令:

nvcc --ptxas-options=-v --compiler-options'-fpic' -o libmaxmul.so --shared maxmul.cu

您需要安裝cuda和nvidia驅動程式!

然後只需使用以下命令執行go**:

go run maxmul.go

...[19 36 16 27 41 31 28 15 24]

這是矩陣相乘的結果!

完整的源**在這裡: https :

翻譯自:

cuda程式設計 c

pytorch op的c 和cuda編寫

官方文件 需求 當你需要頻繁的使用該自定義操作,或者呼叫很昂貴,或者需該操作要用到一些c c 庫。c 擴充套件允許使用者建立源外定義的pytorch運算子,即與pytorch後端分離的運算子。c 擴充套件有兩種形式 使用setuptools提前構建 使用torch.utils.cpp extensi...

C和C 混合程式設計之 extern 「C」的使用

c 號稱是c語言的超集,也確實,從語言的基本語法上,c 是包含所有c語言的語法的,而且c 為了相容c,連c語言的標準庫也被納入到c 的標準庫中,比如在c 中我們仍然可以使用,它就是c 標準庫的一部分 注意最好用新的標準,而不是老的 但是,c 和c語言的編譯器在有些地方還是有差別的。比如,c 是支援物...

C 程式設計技巧輕鬆實現對檔案的操作

c 寫入 讀出文字檔案 string filename c i.txt streamreader sr new streamreader filename string str sr.readline sr.close rw.writeline 寫入 rw.writeline abc rw.writ...