Matrix 添加两个矩阵,其中一个与int.CUDA相乘

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]

我试着做标题上说的事。执行此计算: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], 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);