GPU核函數運行unspecified launch failure

 

這幾天想往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);

發佈了36 篇原創文章 · 獲贊 29 · 訪問量 28萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章