我已经尝试了一段时间并且遇到了看似已经发布的类似问题但是由于某种原因我仍然无法清除错误。正如我所见,我实际上想要将2D矩阵作为一维数组传递给内核。我不确定我的语法出错了但是我提供给内核的变量和内核期望的参数存在冲突。
__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;
}
这是我的内核函数,其参数都是整数,除了“cost”,它是指向整数数组的指针。
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;
}
在内核调用上,我收到错误“类型'int *'的参数与'int'类型的参数不兼容”但我相信我的d_cost已经是一个指针。我很欣赏直截了当,因为我确信我会忽略一些小事。
答案 0 :(得分:1)
你遇到麻烦不是d_target
。其他三个参数是int*
,但相应的参数声明为int
。
K&amp; R的C编程语言第25页说:
我们通常将参数用于函数定义中括号列表中命名的变量,参数用于函数调用中使用的值。
由于您的source
和target
只是一个整数值,因此您并不需要为它们定义设备端变量。只需将整数值本身作为参数传递即可。通过这样做,您将获得性能改进,因为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
答案 1 :(得分:0)
你的三个参数需要是整数,但是你传递指向整数的指针。您需要更改方法签名:
__global__ void calculatePath(int *source, int *target, int *cost, int *distance)