代码之家  ›  专栏  ›  技术社区  ›  mahmood

cuda内核似乎没有被调用

  •  0
  • mahmood  · 技术社区  · 5 年前

    #include <iostream>
    #include <math.h>
    #include <stdlib.h>
    #define N 1
    
    __global__ void vector_addition( int *a, int *b, int *c )
    {
      int i = blockDim.x + blockIdx.x + threadIdx.x;
      if ( i < N )
        c[ i ] = a[ i ] + b[ i ];
    }
    
    int main()
    {
      size_t bytes = N*sizeof( int );
      int *A = (int *)malloc(bytes);  
      int *B = (int *)malloc(bytes);  
      int *C = (int *)malloc(bytes);
    
      int *d_A, *d_B, *d_C;
      cudaMalloc( &d_A, bytes ); 
      cudaMalloc( &d_B, bytes );  
      cudaMalloc( &d_C, bytes );
    
      for ( int i = 0; i < N; i++ ) {
        A[ i ] = 1; B[ i ] = 2; C[ i ] = 0;
      }
    
      cudaMemcpy( d_A, A, bytes, cudaMemcpyHostToDevice );
      cudaMemcpy( d_B, B, bytes, cudaMemcpyHostToDevice );
    
      int thr_per_blk = 1024;
      int blk_in_grid = ceil( float( N ) / thr_per_blk );
    
      vector_addition<<< blk_in_grid, thr_per_blk >>>( d_A, d_B, d_C );
    
      cudaMemcpy( C, d_C, bytes, cudaMemcpyDeviceToHost );
      for ( int i = 0; i < N; i++ ) {
        if ( C[ i ] != 3 ) {
          std::cout << "error\n";
        }
      }
    
      free( A ); free( B ); free( C );
      cudaFree( d_A ); cudaFree( d_B ); cudaFree( d_C );
    
      return 0;
    }
    

    输出是 error 信息。

    0 回复  |  直到 5 年前
        1
  •  2
  •   Robert Crovella    5 年前

    内核中的这一行不正确:

    int i = blockDim.x + blockIdx.x + threadIdx.x;
    

    这不是生成1D索引的正确方法。应该是:

    int i = blockDim.x * blockIdx.x + threadIdx.x;
    

    如果索引不正确,第一个线程(应该为全局唯一索引生成0)将生成1024+0+0=1024。这不符合 if 在内核中进行测试,因此没有线程实际执行任何操作。