除錯**的過程中,發現了這樣乙個問題
#include
using
namespace std;
intmain()
本以為直接指定陣列大小和先生成指標再指定空間大小的sizeof()
會是一樣大的,結果不是一樣大。
因為這個錯誤,在cuda c中除錯了很久,最後終於發現是這裡錯了。
cuda c, 使用歸約法求點積
有下面幾個關鍵點:
1、指定block和thread的數量,不宜過少也不宜過多。
2、使用共享記憶體,乙個執行緒塊中每個執行緒都可以訪問此共享記憶體
3、使用歸約法,乙個執行緒塊中對執行緒求和的部分複雜度節約到了logn,不過執行緒數量應該是2的k次方,k為整數。
4、使用同步執行緒__syncthreads()
cuda c求一維陣列點積源**
#include
#define imin(a, b) (a#define sum_squares(x) (x*(x+1)*(2*x+1)/6)
// 平方和
using
namespace std;
const
int n =33*
1024
;const
int threadsperblocks =
256;
const
int blockspergrid =
imin(32
,(n + threadsperblocks -1)
/ threadsperblocks)
;// 向上取整獲取執行緒塊的數量
__global__ void
dot(
float
*a,float
*b,float
*c) cache[cacheindex]
= temp;
// 將所有的乘法結果聚集到乙個grid(網格)裡面
__syncthreads()
;// 直到上面的所有語句在所有執行緒裡都執行結束才可以進行下面的語句,即為同步
int i = threadsperblocks /2;
while
(i !=0)
if(cacheindex ==0)
c[blockidx.x]
= cache[0]
;}intmain()
cudamemcpy
(dev_a, a, n *
sizeof
(float
), cudamemcpyhosttodevice)
;cudamemcpy
(dev_b, b, n *
sizeof
(float
), cudamemcpyhosttodevice)
; dot <<
>
>
(dev_a, dev_b, dev_partial_c)
;cudamemcpy
(partial_c, dev_partial_c, blockspergrid *
sizeof
(float
), cudamemcpydevicetohost)
; c =
0.0;
for(
int i =
0; i < blockspergrid;
++i)
cout << c <<
" =? "
<<2*
(float
)sum_squares
(float
(n -1)
)<< endl;
}
深入理解CUDA點積運算
本部落格已遷移至segmentfault cuda程式設計學習專欄共享記憶體之bank衝突。本博主未來關於cuda平行計算的文章都將發布在segmentfault cuda程式設計學習專欄,這裡是跳轉鏈結 最近一直在學習cuda平行計算的相關知識。在學習 gpu高效能程式設計cuda實戰 機械工業出...
計算幾何 點積與叉積
a和b為兩個向量,a x1,y1 b x2,y2 a b的幾何意義為a在b上的投影長度乘以b的模長 a b a b cos 其中 為a,b之間的夾角 a b x1 x2 y1 y2 點積的應用 1 判斷兩個向量是否垂直 a b a b 0 2 求兩個向量的夾角,點積 0為鈍角,點積 0為銳角 向量積...
09 向量點積計算
總時間限制 1000ms 記憶體限制 65536kb 描述給定兩個n維向量a a1,a2,an 和b b1,b2,bn 求點積a b a1b1 a2b2 anbn。輸入第一行是乙個整數n。1 n 1000。第二行包含n個整數a1,a2,an。第三行包含n個整數b1,b2,bn。相鄰整數之間用單個空格...