CUDA開發 CUDA Thrust 規約求和

2022-09-05 02:24:09 字數 2580 閱讀 8266

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...