Проблема производительности с кодом CUDA, использование одной переменной занимает в 100 раз больше времени для выполнения - PullRequest
0 голосов
/ 08 декабря 2010

У меня есть это: (это беспорядок, потому что я меняю каждый бит, чтобы увидеть, что не так, и что делает компилятор)

__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;
}

Проблема в этих двух операторах возврата ..если i return value, все ядро ​​занимает примерно 300ms, если i return x, то примерно 100 *.В чем проблема с этим?Я попробовал немного __syncthreads(), но все равно получил то же самое плохое время.

Эти функции возврата не являются окончательным кодом, мне нужен оператор if else для выбора возвращаемого значения, он либо будетvalue или value + x, и этот оператор if занимает слишком много времени.

Спасибо.

Ответы [ 2 ]

2 голосов
/ 08 декабря 2010

Время, которое вы измеряете, не время для возврата переменной, это время для вычисления x.NVCC обнаруживает, что у вас есть много кода, который абсолютно ничего не делает, поскольку его результаты никогда не используются, если вы не вернете x.Удаляет бесполезный код, делая функцию быстрее.

1 голос
/ 08 декабря 2010

return value просто возвращает один из аргументов функции, что делает всю функцию недоступной. Я думаю, это полностью оптимизировано. Когда вы return x выполняете реальную работу и занимает 33 с.

...