Thrust快速入門教程(三) 演算法 1

2021-05-25 13:31:29 字數 1378 閱讀 2798

thrust提供了豐富的常用並行演算法。這演算法的功能與stl中的非常相似,於是我們使用了相同的名稱(例如thrust::sort 與std::sort)。

所有的thrust演算法均提供了主機端和裝置端。特別指出,當轉入主機端迭代器時,將會排程主機端方法,相似的,當使用裝置端迭代器時將使用裝置端實現。

trust::copy是乙個例外,他可以任意的拷貝主機端和裝置端的資料。但是所有的迭代器引數必須符合演算法的要求,要與之對應。當不能滿足要求的時候,編譯器會報錯。

transformations

transformations演算法作用是用來將目標容器賦上特定值(例如零)或者特定數列。之前的例子我們已經使用過thrust::fill,可以向所有元素賦特定值。此外transformations演算法還包括thrust::sequence、thrust::replace、thrust::transform。完整的列表請參考文件。

下面的**演示了幾個transformation演算法的用法。注意類似於c++中擁有的thrust::negate和thrust::modulus,thrust在thrust/functional.h中也提供了,此外還有plus與multiplies等。

thrust/fuctuional.h中的函式提供了大部分內建代數和比較運算,但是我們想提供更多出色的功能。比如,運算y < - a * x + y,x、y為向量,a為常數標量。這其實就是我們所熟知的由blas提供的saxpy運算。

如果我們在thrust中實現saxpy我們有幾個選擇。乙個是,我們需要使用兩個transformations(乙個加和乙個乘法)還有乙個臨時數則用於儲存a乘後的值。另一更佳選擇是使用乙個單獨的由使用者自己定義函式的transformation,這才是我們真正先要的。我下面用源**解釋說明這兩種方法。

saxpy_fast和saxpy_slow都是有效的saxpy實現,儘管saxpy_fast會比saxpy_slow更快。忽略臨時向量分配與代數運算的花費,其開銷如下:

fast_saxpy:2n次讀取和n次寫入

slow_saxpy:4n次讀取和3n寫入

因為saxpy受到記憶體約束(它的效能受限於記憶體的頻寬,而不是浮點效能)更大量的讀寫操作使得saxpy_slow開銷更加昂貴。而saxpy_fast執行速度與優化的blas實現中的saxpy一樣快。在類似saxpy記憶體約束演算法通常值得使用kernel融合(合併多個計算於單獨的kernel)的方法以最小化記憶體的讀寫交換。

thrust::transform只支援乙個或者兩個輸入引數的transformations(例如f(x) -> y 和f(x; y) -> z)。當transformation使用多於兩個輸入引數的時候需要使用其他方法了。例子arbitrary_transformation展示了使用thrust::zip_interator和thrust::for_each的解決方案。

Thrust快速入門教程(一) 簡介

thrust 是乙個類似於stl的針對cuda的c 模板庫。trust提供與cuda c完全相容的介面,可以使我們高效地編寫高效能並行程式。thrust提供了豐富的資料並行演算法,例如scan sort reduce等,可以簡單快捷地構成複雜演算法,並使得 獲得更高的可讀性。使用這些高度抽象的方法來...

matplotlib快速入門教程

matplotlib是乙個python的2d的繪相簿,通過使用matplotlib我們只需要幾行簡潔的 就可以繪圖,直方圖 功率譜 條形圖 錯誤圖 散點圖等。這篇部落格主要介紹的是matplotlib.pyplot模組,matplotlib其實就是乙個模仿matlab開發的python庫。當然,它不...

Linux快速入門教程

序言 linux是一套免費使用和自由傳播的類unix作業系統,這個系統是由全世界各地的成千上萬的程式設計師設計和實現的。下面的一些linux教程是為了快速入門,目的在於能快速掌握linux的基本知識,能對伺服器進行基本的維護。1.1 命令列操作 1.1.1 shell 簡介 1.1.2 shell ...