Matrix Cuda核函数只改变矩阵';第一排

Matrix Cuda核函数只改变矩阵';第一排,matrix,cuda,parallel-processing,Matrix,Cuda,Parallel Processing,我试图将两个矩阵a_h_1和a_h_2相加,并将结果写回a_h_1。但是由于某种原因,我的内核函数除了前N个元素外,不改变数组成员。例如,即使我写一个[8]=45,当它被复制回主机时,它也被打印为8。怎么了 #include <stdio.h> #include <cuda_runtime.h> #include <device_launch_parameters.h> #include <cuda.h> // Kernel that execut

我试图将两个矩阵a_h_1和a_h_2相加,并将结果写回a_h_1。但是由于某种原因,我的内核函数除了前N个元素外,不改变数组成员。例如,即使我写一个[8]=45,当它被复制回主机时,它也被打印为8。怎么了

#include <stdio.h>
#include <cuda_runtime.h>
#include <device_launch_parameters.h>
#include <cuda.h>
// Kernel that executes on the CUDA device
__global__ void matrix_summation(float *a, float *b, int M, int N)
{
    int idx = blockIdx.x * blockDim.x + threadIdx.x;
    if (idx<M*N)
    {
        a[idx] = blockIdx.x;
    }
}
// main routine that executes on the host
int main(void)
{
    float *a_h_1,*a_h_2, *a_d_1,*a_d_2; // Pointer to host & device arrays
    const int N = 5;
    const int M = 5;
    // Number of elements in arrays
    size_t size = (N * M) * sizeof(float);
    a_h_1 = (float *)malloc(size); // Allocate array1 on host
    a_h_2 = (float *)malloc(size); // Allocate array2 on host
    cudaMalloc((void **) &a_d_1, size); // Allocate array1 on device
    cudaMalloc((void **) &a_d_2, size); // Allocate array2 on device
    // Initialize host array and copy it to CUDA device
    for (int i=0; i<N*M; i++){
        a_h_1[i] = (float)i;
        a_h_2[i] = (float)i;
    }
    cudaMemcpy(a_d_1, a_h_1, size, cudaMemcpyHostToDevice);
    cudaMemcpy(a_d_2, a_h_2, size, cudaMemcpyHostToDevice);
    // Do calculation on device:
    int block_size = M;
    int n_blocks = (M*N)/block_size;
    matrix_summation <<< n_blocks, block_size >>> ( a_d_1,a_d_2, M, N));
    // Retrieve result from device and store it in host array
    cudaMemcpy(a_h_1, a_d_1, sizeof(float)*N, cudaMemcpyDeviceToHost);
    // Print results
    printf("\n\nROW 1 \n");
    for (int i=0; i<(M*N); i++)
    {
        printf(" %f ", a_h_1[i]);       
        if((i+1)%N == 0)
        {
            printf("\nROW %d \n", ((i+1)/N)+1);
        }
    }
    // Cleanup
    free(a_h_1);
    free(a_h_2);
    cudaFree(a_d_1);
    cudaFree(a_d_2);
    system("pause");
}
#包括
#包括
#包括
#包括
//在CUDA设备上执行的内核
__全局无效矩阵求和(浮点*a,浮点*b,整数M,整数N)
{
int idx=blockIdx.x*blockDim.x+threadIdx.x;

如果(idx看起来您没有将所有设备阵列复制到主机阵列。在这一行中:

cudaMemcpy(a_h_1, a_d_1, sizeof(float)*N, cudaMemcpyDeviceToHost);

我想您是想复制
sizeof(float)*N*M

看起来您没有将所有设备阵列复制到主机阵列。在这一行中:

cudaMemcpy(a_h_1, a_d_1, sizeof(float)*N, cudaMemcpyDeviceToHost);

我想你是想复制
sizeof(float)*N*M

为什么您的代码中没有任何API错误检查?您怎么知道内核正在运行?您的
矩阵求和
内核无法生成您描述的输出。为什么您的代码中没有任何API错误检查?您怎么知道内核正在运行?您的
矩阵求和
nel无法生成您描述的输出。