c cuda 指定gpu_一个程序来比较cuda/c在GPU/CPU的运行效率

代码如下:

#include "cuda_runtime.h"

#include "device_launch_parameters.h"

#include

#include

#define N (1024*1024)

#define M (10000)

#define THREADS_PER_BLOCK 1024

void serial_add(double *a, double *b, double *c, int n, int m)

{

for(int index=0;index

{

for(int j=0;j

{

c[index] = a[index]*a[index] + b[index]*b[index];

}

}

}

__global__ void vector_add(double *a, double *b, double *c)

{

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

for(int j=0;j

{

c[index] = a[index]*a[index] + b[index]*b[index];

}

}

int main()

{

clock_t start,end;

double *a, *b, *c;

int size = N * sizeof( double );

a = (double *)malloc( size );

b = (double *)malloc( size );

c = (double *)malloc( size );

for( int i = 0; i < N; i++ )

{

a[i] = b[i] = i;

c[i] = 0;

}

start = clock();

serial_add(a, b, c, N, M);

printf( "c[%d] = %f\n",0,c[0] );

printf( "c[%d] = %f\n",N-1, c[N-1] );

end = clock();

float time1 = ((float)(end-start))/CLOCKS_PER_SEC;

printf("CPU: %f seconds\n",time1);

start = clock();

double *d_a, *d_b, *d_c;

cudaMalloc( (void **) &d_a, size );

cudaMalloc( (void **) &d_b, size );

cudaMalloc( (void **) &d_c, size );

cudaMemcpy( d_a, a, size, cudaMemcpyHostToDevice );

cudaMemcpy( d_b, b, size, cudaMemcpyHostToDevice );

vector_add<<< (N + (THREADS_PER_BLOCK-1)) / THREADS_PER_BLOCK, THREADS_PER_BLOCK >>>( d_a, d_b, d_c );

cudaMemcpy( c, d_c, size, cudaMemcpyDeviceToHost );

printf( "c[%d] = %f\n",0,c[0] );

printf( "c[%d] = %f\n",N-1, c[N-1] );

free(a);

free(b);

free(c);

cudaFree( d_a );

cudaFree( d_b );

cudaFree( d_c );

end = clock();

float time2 = ((float)(end-start))/CLOCKS_PER_SEC;

printf("CUDA: %f seconds, Speedup: %f\n",time2, time1/time2);

return 0;

}

运行结果:

c[0] = 0.000000

c[1048575] = 2199019061250.000000

Serial: 41.743248 seconds

c[0] = 0.000000

c[1048575] = 2199019061250.000000

CUDA: 0.967309 seconds, Speedup: 43.153996

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值