CUDA代码的性能问题,使用一个变量需要花费100倍的时间来执行

时间:2010-12-08 03:17:32

标签: cuda textures

我有这个:(这是一团糟,因为我正在改变每一点,看看有什么不对,以及编译器在做什么)

__device__ inline int f(int i, int j, int value)
{
    int x;
    int y;
    int delta;

    int* p = p_new_solution;
    int pitch = p_new_solution_pitch;

    int* p_row_i = (int*)((char*)p + i * pitch);
    int p_i = p_row_i[threadIdx.x + blockIdx.x * blockDim.x];

    int* p_row_j = (int*)((char*)p + j * pitch);
    int p_j = p_row_j[threadIdx.x + blockIdx.x * blockDim.x];

    delta =  (tex2D(A_matrix, i, i) - tex2D(A_matrix, j, j)) * (tex2D(B_matrix, p_j, p_j) - tex2D(B_matrix, p_i, p_i));
    delta += (tex2D(A_matrix, i, j) - tex2D(A_matrix, j, i)) * (tex2D(B_matrix, p_j, p_i) - tex2D(B_matrix, p_i, p_j));


    for(int k = 0 ; k < n ; k++)
    {
        int* p_row = (int*)((char*)p + k * pitch);
        int p_k = p_row[threadIdx.x + blockIdx.x * blockDim.x];

        int A_ki = tex2D(A_matrix, k, i);
        int A_kj = tex2D(A_matrix, k, j);
        int A_ik = tex2D(A_matrix, i, k);
        int A_jk = tex2D(A_matrix, j, k);
        int B_pkpj = tex2D(B_matrix, p_k, p_j);
        int B_pkpi = tex2D(B_matrix, p_k, p_i);
        int B_pjpk = tex2D(B_matrix, p_j, p_k);
        int B_pipk = tex2D(B_matrix, p_i, p_k);

        x = (A_ki - A_kj);
        x *= (B_pkpj - B_pkpi);

        y = (A_ik - A_jk);
        y *= (B_pjpk - B_pipk);

        x += y;
    }

    x -= ( (tex2D(A_matrix, i, i) - tex2D(A_matrix, i, j)) * (tex2D(B_matrix, p_i, p_j) - tex2D(B_matrix, p_i, p_i)) ) +
           ( (tex2D(A_matrix, i, i) - tex2D(A_matrix, j, i)) * (tex2D(B_matrix, p_j, p_i) - tex2D(B_matrix, p_j, p_i)) );

    x -= ( (tex2D(A_matrix, j, i) - tex2D(A_matrix, j, j)) * (tex2D(B_matrix, p_j, p_j) - tex2D(B_matrix, p_j, p_i)) ) +
           ( (tex2D(A_matrix, i, j) - tex2D(A_matrix, j, j)) * (tex2D(B_matrix, p_j, p_j) - tex2D(B_matrix, p_j, p_j)) );


    x += delta;
    x *= 2; 

    return value;
    //return x;
}

问题在于这两个返回语句..如果我return value,整个内核采用300ms,如果我return x大约需要33000 ms。这有什么问题?我尝试了一些__syncthreads(),但仍然遇到了同样糟糕的时间。

那些返回函数不是最终代码,我需要一个if else语句来选择一个返回值,它要么是value还是value + x,这个if else语句也是很长。

谢谢你。

2 个答案:

答案 0 :(得分:2)

您测量的时间不是返回变量的时间,而是计算x的时间。 NVCC检测到你有很多代码什么都不做,因为如果你不返回x,它的结果永远不会被使用。它删除了无用的代码,使功能更快。

答案 1 :(得分:1)

return value只返回函数的一个参数,使整个函数成为无操作。我猜它会完全被优化掉。当你return x完成实际工作并需要33秒时。