cuda内核似乎没有被调用
我可以知道为什么以下简单的cuda程序在使用CC5.2的设备上失败吗cuda内核似乎没有被调用,cuda,Cuda,我可以知道为什么以下简单的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 )
#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;
}
#包括
#包括
#包括
#定义n1
__全局无效向量加法(int*a,int*b,int*c)
{
inti=blockDim.x+blockIdx.x+threadIdx.x;
if(i(d_A,d_B,d_C);
cudaMemcpy(C,d_C,bytes,cudaMemcpyDeviceToHost);
对于(int i=0;i std::cout内核中的这一行不正确:
int i = blockDim.x + blockIdx.x + threadIdx.x;
这不是生成1D索引的正确方法。它应该是:
int i = blockDim.x * blockIdx.x + threadIdx.x;
如果索引不正确,第一个线程(应该为全局唯一索引生成0)将生成1024+0+0=1024。如果内核中的测试失败,那么实际上没有线程执行任何操作。内核中的这一行不正确:
int i = blockDim.x + blockIdx.x + threadIdx.x;
这不是生成1D索引的正确方法。它应该是:
int i = blockDim.x * blockIdx.x + threadIdx.x;
如果索引不正确,第一个线程(应该为全局唯一索引生成0)将生成1024+0+0=1024。这会使内核中的if
测试失败,因此实际上没有线程执行任何操作