Matrix 添加两个矩阵,其中一个与int.CUDA相乘
我试着做标题上说的事。执行此计算:A*X+Y,其中A是Matrix 添加两个矩阵,其中一个与int.CUDA相乘,matrix,cuda,Matrix,Cuda,我试着做标题上说的事。执行此计算:A*X+Y,其中A是int 代码如下: #include <stdio.h> #define N 1024 __global__ void calculate(int A, int X, int Y, int S) { int tID = blockIdx.x; S[tID] = A*X + Y; } int main(int argc, char *argv[]) { int A, S[N]
int
代码如下:
#include <stdio.h>
#define N 1024
__global__ void calculate(int A, int X, int Y, int S) {
int tID = blockIdx.x;
S[tID] = A*X + Y;
}
int main(int argc, char *argv[]) {
int A, S[N], X[N], Y[N], i;
int dev_A, *dev_S=0, *dev_X=0, *dev_Y=0;
float time;
cudaEvent_t start, stop;
cudaEventCreate(&start);
cudaEventCreate(&stop);
cudaMalloc((void **) &dev_S, N*sizeof(int));
cudaMalloc((void **) &dev_X, N*sizeof(int));
cudaMalloc((void **) &dev_Y, N*sizeof(int));
cudaEventRecord(start, 0);
for(i=0; i<N; i++) {
X[i] = i;
Y[i] = i;
}
cudaMemcpy(&dev_A, &A, sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(&dev_X, X, N*sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(&dev_Y, Y, N*sizeof(int), cudaMemcpyHostToDevice);
calculate<<<N,1>>>(dev_A, *dev_X, *dev_Y, *dev_S);
cudaMemcpy(S, dev_S, N*sizeof(int), cudaMemcpyDeviceToHost);
printf("Array X:\n");
for(i=0; i<N; i++) {
printf("%d\n", X[i]);
}
printf("Array Y:\n");
for(i=0; i<N; i++) {
printf("%d\n", Y[i]);
}
printf("Array S:\n");
for(i=0; i<N; i++) {
printf("%d\n", S[i]);
}
cudaEventRecord(stop, 0);
cudaEventSynchronize(stop);
cudaEventElapsedTime(&time, start, stop);
printf("Elapsed Time: %f\n", time);
cudaEventDestroy(start);
cudaEventDestroy(stop);
cudaFree(dev_S);
cudaFree(dev_X);
cudaFree(dev_Y);
return 0;
}
我是CUDA的新手,刚刚开始。你能帮忙吗?非常感谢
S[tID]
是整数,不能作为数组访问。这不是CUDA的错。您的内核代码稍有错误。正如David Kernin已经说过的,您使用的是整数。但是您应该使用整数数组。此外,对于
tID
您必须使用threadIdx.x
和而不是blockIdx.x
。或者以更一般的形式:
__global__ void calculate(int A, int *X, int *Y, int *S) {
int tID = blockIdx.x * blockDim.x + threadIdx.x;
S[tID] = A*X[tID] + Y[tID];
}
这将允许您处理大于最大值threadIdx.x
的矩阵,因为您可以通过调用
calculate<<<numThreadsPerBlock,numBlocks>>>(A, dev_X, dev_Y, dev_S);
计算(A,dev_X,dev_Y,dev_S);
>我只写S= a*x+y?这不是CUDA问题,我建议学习C++更好。但我要帮你一把:传递一个整数是行不通的,因为一个整数只是一个值。。您正在尝试访问值[0]、值[1]、值[2]等。。每一个线程。你应该通过一个指针数组来表示一个值,足够每个线程使用这些值。我知道如何在C++中完成这个程序,但是CUDA让我感到困惑。想想看:C++中计算S而不返回它是毫无意义的。有了CUDA,您的代码同时由多个线程运行,因此我将执行以下声明:S[N]=A*X[N]+Y[N]?非常感谢您的帮助!最后一个问题。我是那个声明每个块的线程数和块数的人,或者gpu是这样做的?你必须定义它。您的GPU每个块最多可以有512个线程。如果矩阵大于该值,则必须指定多个块。例如,如果矩阵有700个元素,则必须定义numThreadsPerBlock=512,numBlocks=2。但是,您还必须将矩阵的大小传递给内核,并检查if(tID
calculate<<<numThreadsPerBlock,numBlocks>>>(A, dev_X, dev_Y, dev_S);