我有这个:(这是一团糟,因为我正在改变每一点,看看有什么不对,以及编译器在做什么)
__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语句也是很长。
谢谢你。
答案 0 :(得分:2)
您测量的时间不是返回变量的时间,而是计算x
的时间。 NVCC检测到你有很多代码什么都不做,因为如果你不返回x
,它的结果永远不会被使用。它删除了无用的代码,使功能更快。
答案 1 :(得分:1)
return value
只返回函数的一个参数,使整个函数成为无操作。我猜它会完全被优化掉。当你return x
完成实际工作并需要33秒时。