thrust 是乙個開源的 c++ 庫,用於開發高效能並行應用程式,以 c++ 標準模板庫為藍本實現。
官方文件見這裡:cuda thrust
/* ... */
float *fmatrix_device; // 指向裝置視訊記憶體
int imatrixsize = irow * icol; // 矩陣元素個數
cudamalloc((void**)&fmatrix_device, imatrixsize * sizeof(float)); // 在視訊記憶體中為矩陣開闢空間
cudamemcpy(fmatrix_device, fmatrix_host, imatrixsize * sizeof(float), cudamemcpyhosttodevice); // 將資料拷貝到視訊記憶體
thrust::device_ptrdev_ptr(fmatrix_device);
float thrustresult = thrust::reduce(dev_ptr, dev_ptr + size_t(imatrixsize), (float)0, thrust::plus());
其中,fmatrix_host 為指向主機記憶體的矩陣的頭指標。
1. 避免每個 warp **現分支導致效率低下。
2. 減少取餘操作。
3. 減小不必要的同步操作,每個warp都是預設同步的,不用額外的同步操作。
4. 減小執行緒的閒置,提高並行度
資料的大小為:
irow = 1000;
icol = 1000;
時間為:
reducethrust 的執行時間為:0.179968ms.
494497
reduce0 的執行時間為:0.229152ms.
494497
reduce1 的執行時間為:0.134816ms.
494497
reduce2 的執行時間為:0.117504ms.
494497
reduce3 的執行時間為:0.086016ms.
494497
reduce4 的執行時間為:0.07424ms.
494497
cpu的執行時間為:1 ms.
494497
資料的大小為:
irow = 2000;
icol = 2000;
時間為:
reducethrust 的執行時間為:0.282944ms.
1.97828e+006
reduce0 的執行時間為:0.779776ms.
1.97828e+006
reduce1 的執行時間為:0.42624ms.
1.97828e+006
reduce2 的執行時間為:0.343744ms.
1.97828e+006
reduce3 的執行時間為:0.217248ms.
1.97828e+006
reduce4 的執行時間為:0.160416ms.
1.97828e+006
cpu的執行時間為:3 ms.
1.97828e+006
資料的大小為:
irow = 4000;
icol = 4000;
時間為:
reducethrust 的執行時間為:0.536832ms.
7.91319e+006
reduce0 的執行時間為:2.9919ms.
7.91319e+006
reduce1 的執行時間為:1.56054ms.
7.91319e+006
reduce2 的執行時間為:1.26618ms.
7.91319e+006
reduce3 的執行時間為:0.726016ms.
7.91319e+006
reduce4 的執行時間為:0.531712ms.
7.91319e+006
cpu的執行時間為:11 ms.
7.91319e+006
資料的大小為:
irow = 6000;
icol = 6000;
時間為:
reducethrust 的執行時間為:0.988992ms.
1.7807e+007
reduce4 的執行時間為:1.09286ms.
1.7807e+007
cpu的執行時間為:25 ms.
1.7807e+007
資料的大小為:
irow = 11000;
icol = 11000;
時間為:
reducethrust 的執行時間為:2.9208ms.
5.98583e+007
reduce4 的執行時間為:3.36998ms.
5.98583e+007
cpu的執行時間為:85 ms.
5.98583e+007
從上可以看出,2 中介紹的幾種優化方式取得了良好的效果;另外,當資料量較少時,我自己優化的規約函式比 thrust 中的規約更高效,但是當資料量大於 4000 * 4000 時,thrust 更高效,因此還有優化的空間。
4. 完整**
github
cuda的dll開發流程
前言 很久沒寫cuda相關的文章了,其實也不是忙,只是零碎的事情比較多,不能抽出完整的時間寫一些東西,在http blog.csdn.net openhero 上寫本來想寫一些列cuda程式設計的文章,不過現在看來,很多朋友還是只是處在開發的初級階段,一些基本的程式設計環節還需要講解一下,其實像li...
CentOS下配置CUDA開發環境
因為我們的cuda程式是放到伺服器上執行,因此我想用ssh方式連線到主機,然後在主機中編譯執行程式。因為當時是管理員安裝,而我不是管理員使用者,因此環境變數裡面並沒有配置好cuda,需要手動去配。方法 vi bashrc 進入vi後,按i進入插入修改模式,在檔案末尾加入 user specific ...
CUDA開發 了解裝置屬性
今天介紹一下cuda裝置的相關屬性,只有熟悉了硬體是相關屬性,是怎麼工作的,就能寫出更適合硬體工作的 cudadeviceprop這個結構體記錄了裝置的相關屬性。1 struct cudadeviceprop 2 通過cudagetdeviceproperties 得到裝置屬性,cudagetdev...