在編寫用於處理數字圖像的程序的過程中,我編寫了一個緩慢運行的CUDA內核。使用模板模式優化CUDA內核
__global__ void Kernel (int* inputArray, float* outputArray, float3* const col_image, int height, int width, int kc2) {
float G, h;
float fx[3];
float fy[3];
float g[2][2];
float k10 = 0.0;
float k11 = 0.0;
float k12 = 0.0;
float k20 = 0.0;
float k21 = 0.0;
float k22 = 0.0;
float k30 = 0.0;
float k31 = 0.0;
float k32 = 0.0;
int xIndex = blockIdx.x * blockDim.x + threadIdx.x;
int yIndex = blockIdx.y * blockDim.y + threadIdx.y;
if ((xIndex < width - kc2/2) && (xIndex >= kc2/2) && (yIndex < height - kc2/2) && (yIndex >= kc2/2))
{
int idx0 = yIndex * width + xIndex;
if (inputArray[idx0] > 0)
{
for (int i = 0; i < kc2; i++)
{
for (int j = 0; j < kc2; j++)
{
int idx1 = (yIndex + i - kc2/2) * width + (xIndex + j - kc2/2);
float3 rgb = col_image[idx1];
k10 = k10 + constMat1[i * kc2 + j] * rgb.x;
k11 = k11 + constMat1[i * kc2 + j] * rgb.y;
k12 = k12 + constMat1[i * kc2 + j] * rgb.z;
k20 = k20 + constMat2[i * kc2 + j] * rgb.x;
k21 = k21 + constMat2[i * kc2 + j] * rgb.y;
k22 = k22 + constMat2[i * kc2 + j] * rgb.z;
k30 = k30 + constMat3[i * kc2 + j] * rgb.x;
k31 = k31 + constMat3[i * kc2 + j] * rgb.y;
k32 = k32 + constMat3[i * kc2 + j] * rgb.z;
}
}
fx[0] = kc2 * (k30 - k20);
fx[1] = kc2 * (k31 - k21);
fx[2] = kc2 * (k32 - k22);
fy[0] = kc2 * (k10 - k20);
fy[1] = kc2 * (k11 - k21);
fy[2] = kc2 * (k12 - k22);
g[0][0] = fx[0] * fx[0] + fx[1] * fx[1] + fx[2] * fx[2];
g[0][1] = fx[0] * fy[0] + fx[1] * fy[1] + fx[2] * fy[2];
g[1][0] = g[0][1];
g[1][1] = fy[0] * fy[0] + fy[1] * fy[1] + fy[2] * fy[2]
G = g[0][0] * g[1][1] - g[0][1] * g[1][0];
h = g[0][0] + g[1][1];
// Output
int idx2 = (yIndex - kc2/2) * (width - kc2) + (xIndex - kc2/2);
outputArray[idx2] = (h * h)/G;
}
}
}
這裏一些(非負)值inputArray進行處理:下面的代碼中給出。陣列col-image包含RGB模型中的顏色分量。如果inputArray的值滿足條件,則我們計算kc2附近的kc2附近的特定係數k_ {ij},其中心位於所考慮的點(kc2的值爲3或5)。 constMat [1,2,3]的值被存儲在設備的存儲器常數:
__device__ __constant__ float constMat[];
然後我們計算特徵FX,FY,G_ {IJ},H,G和寫入得到的數值爲outputArray。
重要的是,所有指定的數據都存儲在全局內存中,並且輸入數組可以足夠大(大約40萬個點)。所有這些直接影響內核的速度。
我們如何加快內核的執行速度(歡迎使用任何技術:使用共享內存/紋理,使用模板模板等)?
非常感謝您提供測試後編寫的代碼的詳細答案。 –