這幾天想往GPU端的核函數中傳入一個自己的參數矩陣,但是總是不好使
__global__ void
d_render(uint *d_output, uint width, uint height, float tx, float ty, float scale, float cx, float cy,float *hproject)
{
uint x = __umul24(blockIdx.x, blockDim.x) + threadIdx.x;
uint y = __umul24(blockIdx.y, blockDim.y) + threadIdx.y;
uint i = __umul24(y, width) + x;
float u = hproject[0*3+0]*(x-cx)+hproject[0*3+1]*(y-cy)+hproject[0*3+2]*1;
float v = hproject[1*3+0]*(x-cx)+hproject[1*3+1]*(y-cy)+hproject[1*3+2]*1;
u=u/w + cx;
u=v/w + cy;
float4 c = tex2DBilinear<uchar4, float4>(tex42, u, v);
float4 c = tex2D(tex42, u, v);
d_output[i] = rgbaFloatToInt(c);
}
編譯無錯,但是運行時出錯並退出總是提示錯誤:
unspecified launch failure
其中Hproject矩陣
0.661147 -0.059233 -181.873756
0.070179 0.667713 91.632933
0.000105 -0.00006 0.981060
想來應該是計算後的u,v遠遠超出紋理範圍造成訪問時指針越界了吧
w=0.18035697959333510
u=1251.3826539105580
v=-5529.3834966129798
但是直接把上面矩陣部分換爲常數則沒有什麼問題了,看來還是矩陣傳入的問題,或許應該是直接傳入矩陣數組的指針到了共享內存中了,由於沒有同步,各個線程都去訪問自然衝突了,但實際上在函數中傳入的d_output數組指針也沒有問題啊。後來參考了“傳指針給內核”
http://bbs.hpctech.com/viewthread.php?tid=21&extra=page%3D1&page=1
帖子才知道是自己在CPU端的程序中沒有爲GPU中的hproject數組聲明並且分配空間導致的,因而在CPU端傳入hproject數組之前添加如下一段聲明和分配空間的代碼就好了(折騰兩天終於解決了)
__device__ float *hproject;
cudaMalloc((void**)&hproject,sizeof(float)*9);
cudaMemcpy(hproject,&Hproject,sizeof(float)*9,cudaMemcpyHostToDevice);