ядро cuda, кажется, не называется - PullRequest
0 голосов
/ 31 октября 2019

Могу ли я узнать, почему следующая простая программа cuda не работает на устройстве с CC5.2?

#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.

1 Ответ

2 голосов
/ 31 октября 2019

Эта строка в вашем ядре неверна:

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

Это неправильный способ создания одномерного индекса. Это должно быть:

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

При неправильном индексировании первый поток, который должен сгенерировать 0 для глобального уникального индекса, генерирует 1024 + 0 + 0 = 1024. Это не проходит тест if вваше ядро, поэтому никакие потоки на самом деле ничего не делают.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...