2010-12-08 6 views
0

을 실행하는 데 100 시간 이상 소요 : (내가 모든 비트가 뭐가 잘못보고 변화하고있어, 컴파일러가 무엇을하고 있기 때문에 엉망이다)성능 문제는, 내가 이것을 가지고

__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 문과 함께입니다. 만약 내가 일 경우, 전체 커널은 300ms처럼, return x이면 약 33000 ms이 걸립니다. 이것의 문제점은 무엇입니까? 나는 어떤 __syncthreads()을 시도했지만, 여전히 같은 나쁜 시간을 가졌다.

이러한 반환 함수는 최종 코드가 아니므로 반환 값을 선택하려면 if else 문이 필요합니다. value 또는 value + x이되며 else 문도 너무 오래 걸릴 수 있습니다.

감사합니다.

+0

cuda-gdb (리턴 값 버전 포함)에서 실행 해보십시오. 컴파일 후에 x, y, p 등이 존재하지 않는다는 것을 알기를 기대합니다. 실제로이 함수의 모든 라인을 단계별로 실행할 수는 없습니다! 짜증나는 것은 컴파일러를 멈추는 방법을 알아낼 수 없다는 것입니다. 다른 디버그 최적화 레벨로 컴파일하는 것조차도 어렵습니다. – jmilloy

답변

2

측정하는 시간은 변수를 반환 할 시간이 아니며, x을 계산하는 시간입니다. NVCC는 x을 반환하지 않으면 결과가 전혀 사용되지 않으므로 절대 아무것도 수행하지 않는 많은 코드가 있음을 감지합니다. 그것은 쓸모없는 코드를 제거하여 기능을 빠르게합니다.

+0

옙, 나는 그것을 언젠가 전에 알았다. .. 당황해라. .. 그것이 더 빠를 수 없다고 생각해라. / – hfingler

1

return value은 함수의 인수 중 하나를 반환하기 때문에 전체 함수를 아무런 조작하지 않습니다. 나는 그것이 완전히 최적화 된 것 같아요. return x 때 실제 작업을 수행하고 33 걸립니다.

관련 문제