浮点2矩阵(作为1D数组)和CUDA

浮点2矩阵(作为1D数组)和CUDA,cuda,Cuda,我必须使用float2矩阵作为一维数组。我想检查一些东西,我编写了以下代码: #include <stdio.h> #include <stdlib.h> #define index(x,y) x+y*N __global__ void test(float2* matrix_CUDA,int N) { int i,j; i=blockIdx.x*blockDim.x+threadIdx.x; j=blockIdx.y*blockDim

我必须使用float2矩阵作为一维数组。我想检查一些东西,我编写了以下代码:

#include <stdio.h>
#include <stdlib.h>

#define index(x,y) x+y*N

__global__ void test(float2* matrix_CUDA,int N)
{   
    int i,j;

    i=blockIdx.x*blockDim.x+threadIdx.x;
    j=blockIdx.y*blockDim.y+threadIdx.y;

    matrix_CUDA[index(i,j)].x=i;
    matrix_CUDA[index(i,j)].y=j;

}

int main()
{
    int N=256;

    int i,j;

    //////////////////////////////////////////

    float2* matrix;

    matrix=(float2*)malloc(N*N*sizeof(float2));

    //////////////////////////////////////////

    float2* matrix_CUDA;

    cudaMalloc((void**)&matrix_CUDA,N*N*sizeof(float2));

    //////////////////////////////////////////

    dim3 block_dim(32,2,0);
    dim3 grid_dim(2,2,0);

    test <<< grid_dim,block_dim >>> (matrix_CUDA,N);

    //////////////////////////////////////////

    cudaMemcpy(matrix,matrix_CUDA,N*N*sizeof(float2),cudaMemcpyDeviceToHost);


    for(i=0;i<N;i++)
    {
        for(j=0;j<N;j++)
        {
            printf("%d %d, %f %f\n",i,j,matrix[index(i,j)].x,matrix[index(i,j)].y);
        }
    }


    return 0;
}
但我发现:

0 0, -nan 7.265723657
0 1, -nan 152345
0 2, 25.2135235 -nan
0 3, 52354.324534 24.52354234523
...

这意味着我在内存分配方面有一些问题(我想),但我找不到我的代码有什么问题。有人能帮帮我吗?

任何时候当您在使用CUDA代码时遇到问题,在请求帮助之前,您应该始终使用
CUDA memcheck
运行您的代码

即使您不理解输出,它也会对试图帮助您的其他人有用

如果您使用
cuda memcheck
运行此代码,您将获得(在所有其他输出中!)以下输出:

$ cuda-memcheck ./t1273
========= CUDA-MEMCHECK
========= Program hit cudaErrorInvalidConfiguration (error 9) due to "invalid configuration argument" on CUDA API call to cudaLaunch.
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/lib64/libcuda.so.1 [0x2eea03]
=========     Host Frame:./t1273 [0x3616e]
=========     Host Frame:./t1273 [0x2bfd]
=========     Host Frame:./t1273 [0x299a]
=========     Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xf5) [0x21b15]
=========     Host Frame:./t1273 [0x2a5d]
=========
========= ERROR SUMMARY: 1 error
$ 
dim3 block_dim(32,2,1);
dim3 grid_dim(2,2,1);
dim3 block_dim(32,1,1);
dim3 grid_dim(2048,1,1);
这意味着您配置内核启动的方式有问题:

dim3 block_dim(32,2,0);
dim3 grid_dim(2,2,0);

test <<< grid_dim,block_dim >>> (matrix_CUDA,N);
         ^^^^^^^^^^^^^^^^^^
         kernel config arguments
此外,一旦您修复了这个问题,您仍然会发现您的代码并没有触及许多输出。要解决这个问题,您需要增加线程数组的大小以匹配数据数组的大小。因为您有一个1-D阵列,所以我不太清楚为什么要启动2D螺纹块和2D网格。您的数据数组应该是完全“可覆盖”的,线性维度中总共有65536个线程,如下所示:

$ cuda-memcheck ./t1273
========= CUDA-MEMCHECK
========= Program hit cudaErrorInvalidConfiguration (error 9) due to "invalid configuration argument" on CUDA API call to cudaLaunch.
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/lib64/libcuda.so.1 [0x2eea03]
=========     Host Frame:./t1273 [0x3616e]
=========     Host Frame:./t1273 [0x2bfd]
=========     Host Frame:./t1273 [0x299a]
=========     Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xf5) [0x21b15]
=========     Host Frame:./t1273 [0x2a5d]
=========
========= ERROR SUMMARY: 1 error
$ 
dim3 block_dim(32,2,1);
dim3 grid_dim(2,2,1);
dim3 block_dim(32,1,1);
dim3 grid_dim(2048,1,1);

每当您在使用CUDA代码时遇到问题,在请求帮助之前,应始终使用
CUDA memcheck
运行您的代码

即使您不理解输出,它也会对试图帮助您的其他人有用

如果您使用
cuda memcheck
运行此代码,您将获得(在所有其他输出中!)以下输出:

$ cuda-memcheck ./t1273
========= CUDA-MEMCHECK
========= Program hit cudaErrorInvalidConfiguration (error 9) due to "invalid configuration argument" on CUDA API call to cudaLaunch.
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/lib64/libcuda.so.1 [0x2eea03]
=========     Host Frame:./t1273 [0x3616e]
=========     Host Frame:./t1273 [0x2bfd]
=========     Host Frame:./t1273 [0x299a]
=========     Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xf5) [0x21b15]
=========     Host Frame:./t1273 [0x2a5d]
=========
========= ERROR SUMMARY: 1 error
$ 
dim3 block_dim(32,2,1);
dim3 grid_dim(2,2,1);
dim3 block_dim(32,1,1);
dim3 grid_dim(2048,1,1);
这意味着您配置内核启动的方式有问题:

dim3 block_dim(32,2,0);
dim3 grid_dim(2,2,0);

test <<< grid_dim,block_dim >>> (matrix_CUDA,N);
         ^^^^^^^^^^^^^^^^^^
         kernel config arguments
此外,一旦您修复了这个问题,您仍然会发现您的代码并没有触及许多输出。要解决这个问题,您需要增加线程数组的大小以匹配数据数组的大小。因为您有一个1-D阵列,所以我不太清楚为什么要启动2D螺纹块和2D网格。您的数据数组应该是完全“可覆盖”的,线性维度中总共有65536个线程,如下所示:

$ cuda-memcheck ./t1273
========= CUDA-MEMCHECK
========= Program hit cudaErrorInvalidConfiguration (error 9) due to "invalid configuration argument" on CUDA API call to cudaLaunch.
=========     Saved host backtrace up to driver entry point at error
=========     Host Frame:/lib64/libcuda.so.1 [0x2eea03]
=========     Host Frame:./t1273 [0x3616e]
=========     Host Frame:./t1273 [0x2bfd]
=========     Host Frame:./t1273 [0x299a]
=========     Host Frame:/lib64/libc.so.6 (__libc_start_main + 0xf5) [0x21b15]
=========     Host Frame:./t1273 [0x2a5d]
=========
========= ERROR SUMMARY: 1 error
$ 
dim3 block_dim(32,2,1);
dim3 grid_dim(2,2,1);
dim3 block_dim(32,1,1);
dim3 grid_dim(2048,1,1);
..