2017-05-18 34 views
1

我一直在尝试一段时间,并且遇到了似乎已经发布的类似问题,但由于某些原因,我仍然无法访问清除错误。正如我所见,我实际上想要将2D矩阵作为一维数组传递给内核。我不确定在我的语法中哪里出了问题,但就我提供给内核的变量和内核期望的参数而言存在冲突。类型“int *”的参数与cuda内核中的类型“int”的参数不兼容调用

__global__ void calculatePath(int source, int target, int *cost, int distance){ 

int t_id = blockIdx.x * blockDim.x + threadIdx.x; 


int dist[50]; 
int prev[50]; 
int selected[50]={0}; 
int num_path[50]; 

int d, m, min, start, j; 

if ((t_id > 0) && (t_id < N)){ 
    dist[t_id] = IN; 
    prev[t_id] = -1; 
} 

这是我的核函数,它的参数是所有整数除“成本”,它是一个指向一个整数数组。

int main(int argc, char **argv){ 


int h_num_path[N]; 
int h_distance = 0; 
int h_cost[N][N],i,j,co; 
int h_source; 
int h_target; 

printf("\tShortest Path Algorithm(DIJKSRTRA's ALGORITHM\n\n"); 
for(i=0;i< N;i++) 
    for(j=0;j< N;j++) 
     h_cost[i][j] = IN; 

//********************* 
srand (time(NULL)); 
for(int x=1;x< N;x++) { 
    for (int y = x + 1; y < N; y++) { 
     h_cost[x][y] = h_cost[y][x] = (rand() % 100) + 1; 
    } 
} 

printf("\nEnter The Source: "); 
scanf("%d", &h_source); 
printf("\nEnter The target: "); 
scanf("%d", &h_target); 

int *d_num_path; 
int *d_cost; 
int *d_source; 
int *d_target; 
int *d_dist; 
int *d_prev; 
int *d_distance; 

cudaMalloc(&d_num_path, sizeof(int)*N); 
cudaMalloc(&d_cost, sizeof(int)*N*N); 

cudaMalloc((void**) &d_source, sizeof(int)); 
cudaMalloc((void**) &d_target, sizeof(int)); 
cudaMalloc((void**) &d_dist, sizeof(int)*N); 
cudaMalloc((void**) &d_distance, sizeof(int)); 

cudaMemcpy(d_source, &h_source, sizeof(int), cudaMemcpyHostToDevice); 
cudaMemcpy(d_target, &h_target, sizeof(int), cudaMemcpyHostToDevice); 
cudaMemcpy(d_cost, h_cost, sizeof(int)*N*N, cudaMemcpyHostToDevice); 
cudaMemcpy(d_distance, &h_distance, sizeof(int), cudaMemcpyHostToDevice); 
cudaMemcpy(d_num_path, &h_num_path, sizeof(int)*N, cudaMemcpyHostToDevice); 

clock_t before; 
before = clock(); 

calculatePath<<<N/512 + 1, 512>>>(d_source, d_target, d_cost, d_distance); 

clock_t time_taken = clock() - before; 

cudaMemcpy(&h_num_path, d_num_path, sizeof(int)*N, cudaMemcpyDeviceToHost); 
cudaMemcpy(&h_distance, d_distance, sizeof(int), cudaMemcpyDeviceToHost); 

cudaFree(d_num_path); 
cudaFree(d_cost); 
cudaFree(d_source); 
cudaFree(d_target); 
cudaFree(d_dist); 
cudaFree(d_prev); 
cudaFree(d_distance); 

printf("\nShortest Path: %d \n",co); 
printf("%s %.4f %s", "Time taken:", time_taken/1000.0, "seconds"); 

return 0; 

}

在内核调用,然而,我收到错误“类型的参数‘诠释*’是类型‘诠释’的参数不符”,但我相信我的d_cost已经是一个指针。我很高兴被设置为直线,因为我确信我可以忽略一些小事。

+1

'我不知道,我已经在我的语法'看了你的错误/警告'类型的参数为“int *”是类型为“INT”的参数不兼容出了错ll' – Michi

+0

那是什么错误信息告诉你:你相信'd_cost'是一个指针,它是。但该函数期望'int'。 –

+0

@JpDizzy你知道参数和参数之间的区别是什么吗? – Michi

回答

1

这不是d_target您遇到了问题。其他三个参数是int*,但相应的参数被声明为int

被K & [R 25页C程序设计语言说:

我们通常会使用一个在函数定义的组合列表命名变量参数参数的价值用于该函数的调用。

由于您的sourcetarget只是一个单一的整数值,你并不真的需要为他们定义设备端变量。只要传递整数值本身作为参数。通过这样做,你会得到性能改进,如talonmies所评论的那样:

(通过值传递)内核中存在恒定的内存缓存广播,如果这样做的话。为简单常量传递指针只会增加延迟,方法是强制每个线程解引用指针以从全局内存中检索值,再加上所有附加的主机端内存API来首先分配它们。

而且,你似乎期望参数distance有内核的产值,那么它必须被声明为指针,这样你就可以内核后做cudaMemcpyDeviceToHost

__global__ void calculatePath(int source, int target, int *cost, int *distance) // kernel definition 

caculatePath<<< (N + 511)/512, 512 >>>(h_source, h_target, d_cost, d_distance) // kernel launch 
0

你的三个参数需要是整数,但是你将指针传递给整数。您需要更改您的方法签名:

__global__ void calculatePath(int *source, int *target, int *cost, int *distance) 
+2

但是,您无法取消引用这些指针。它们不是主机地址空间中的有效指针 – talonmies

+0

好点 - 我改变了我的答案 –

+0

@talonmies - 最初,这些指针并不指向任何东西(它应该在开始时设置为NULL)。但cudaMalloc()将分配内存,并使用cudaMemcpy()设置值。为什么不在这里取消引用工作? –

相关问题