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