【发布时间】:2025-11-21 07:10:02
【问题描述】:
我有一个项目,我必须在 Visual Studio/CUDA 中使用 GPU 线程和块创建一个程序,其中包含 2 个随机数组 A 和 B,用于在存储结果之前进行计算在第三个数组C 中,基于此等式的值:
C(1,j)=max(A(:,j)+max(B(:,j)) (注意:“:”运算符表示所有行)
这是我的内核函数
__global__ void mykernel(int **a, int **b,int **c,const int width)
{
int col= threadIdx.x;
int tempa=0;
int tempb=0;
for(int k=0;k<width;k++){
int maxA=a[k][col];
if (maxA>tempa){
tempa=maxA;
}
int maxB=b[k][col];
if (maxB>tempb){
tempb=maxB;
}
}
c[0][col] =tempa+tempb;
}
还有我的主要
int main()
{
const int dim= 5;
const int rows=5;
const int columns=5;
size_t dsize = rows*columns*sizeof(int);
//Αντίγραφα πινάκων δεδομένων της CPU
int *A[dim][dim];
int *B[dim][dim];
int *C[1][dim];
//Αντίγραφα πινάκων δεδομένων της GPU
int *d_A[dim][dim],*d_B[dim][dim],*d_C[1][dim];
//Εξασφάλιση μνήμης για τα αντίγραφα δεδομένων της CPU
A[dim][dim]= (int *)malloc(dsize);
B[dim][dim] = (int *)malloc(dsize);
C[1][dim]= (int *)malloc(dsize);
//Γέμισμα των πινάκων με τυχαίες τιμές μεταξυ
for (int i=0;i<rows;i++)
for (int j=0;j<columns;j++){
*A[i][j]=rand() %5+1;
*B[i][j]=rand() %5+1;
}
//Εξασφάλιση μνήμης για τα αντίγραφα δεδομένων της GPU και αντιγραφή δεδομένων CPU προς GPU
cudaMalloc((void **)&d_A, dsize);
cudaMemcpy(d_A, A, dsize, cudaMemcpyHostToDevice);
cudaMalloc((void **)&d_B, dsize);
cudaMemcpy(d_B, B, dsize, cudaMemcpyHostToDevice);
cudaMalloc((void **)&d_C, dsize);
//Κλήση Kernel συνάρτησης στην GPU με χρήση 5 Threads σε 1 Block
mykernel<<<1,5>>>(d_A,d_B,d_C,dim);
//Αντιγραφή αποτελέσματος στην μνήμη της CPU
cudaMemcpy(C, d_C, dsize, cudaMemcpyDeviceToHost);
//Εκκαθάριση Μνήμης για CPU και GPU
free(A);
free(B);
free(C);
cudaFree(d_A); cudaFree(d_B); cudaFree(d_C);
while(1){};
return 0;
}
我认为我的算法是正确的,但在这一行中我收到以下错误:
线
mykernel<<<1,5>>>(d_A,d_B,d_C,dim);
错误
argument of type "int *(*)[5]" is incompatible with parameter of type "int **"
对我应该做什么有什么建议吗?
【问题讨论】:
-
P.S:这是我的第一篇文章,如果我弄乱了所需的格式,请提前道歉。 --> 第一篇文章的格式很好! ;-)
-
@Allan 谢谢我的朋友!真的很期待一个提示,因为我已经连续 4 个小时脑洞大开!哈哈
-
这里明显缺乏对某些 C 编程概念的理解。这段代码中可能存在大约 3-6 种不同类型的错误,这些错误必须被解开才能实现某些功能。一般来说,您似乎对在 CUDA 中使用 2D 数组感兴趣,因此查看 this 可能会有所帮助,但它并不能直接解决您代码中的所有错误。