为什么用cuda写循环反而变慢了

sbaban 2015-05-23 09:32:27
这是没用cuda的


#include <stdio.h>
#include<time.h>
int main()
{
void fun(long int N);
clock_t start, finish;
start = clock();

fun(65536);
finish = clock();
printf("耗时%.3lf\n", (double)finish - start);
return 0;
}
void fun(long int N)
{
long int h_a[65536];long int h_b[65536]; long int h_c[65536];
for (long long int i = 0; i < N; i++)
{
h_a[i] = i;
h_b[i] = i;
h_c[i] = 0;
}
for (long int j = 0; j < N; j++)
{
h_c[j] = h_a[j] + h_b[j] ;
printf("%ld ", h_c[j]);
}
printf("\n");
}
这是用了cuda的


cuda代码如下

#include<time.h>
#include <malloc.h>
#include <stdio.h>
#include <cuda_runtime.h>

/* 运行在GPU端的程序 */
__global__ void vectorADD(int* a, int* b, int* c)
{
int index = threadIdx.x+blockIdx.x*blockDim.x;//获得当前线程的序号
if (index < 65536)
c[index] = a[index]+ b[index] ;
}

int main()
{
clock_t start, finish;
start = clock();
void fun(int N);

fun(65536);
finish = clock();
printf("耗时%.3lf\n", (double)finish - start);

return 0;
}
void fun(int N)
{

/* 本地开辟三个数组存放我们要计算的内容 */
int* h_a = (int*)malloc(N * sizeof(int));
int* h_b = (int*)malloc(N * sizeof(int));
int* h_c = (int*)malloc(N * sizeof(int));
/* 初始化数组A, B和C */
for (int i = 0; i<N; i++)
{
h_a[i] = i;
h_b[i] = i;
h_c[i] = 0;
}

/* 计算N个int型需要的空间 */
int size = N * sizeof(int);

/* 在GPU上分配同样大小的三个数组 */
int* d_a;
int* d_b;
int* d_c;
cudaMalloc((void**)&d_a, size);
cudaMalloc((void**)&d_b, size);
cudaMalloc((void**)&d_c, size);

/* 把本地的数组拷贝进GPU内存 */
cudaMemcpy(d_a, h_a, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_b, h_b, size, cudaMemcpyHostToDevice);
cudaMemcpy(d_c, h_c, size, cudaMemcpyHostToDevice);

/* 定义一个GPU运算块 由 10个运算线程组成 */
dim3 DimBlock = 128;
/* 通知GPU用10个线程执行函数vectorADD */
vectorADD <<<512, DimBlock >>>(d_a, d_b, d_c);
/* 将GPU运算完的结果复制回本地 */
cudaMemcpy(h_c, d_c, size, cudaMemcpyDeviceToHost);

/* 释放GPU的内存 */
cudaFree(d_a);
cudaFree(d_b);
cudaFree(d_c);

/* 验证计算结果 */
for (int j = 0; j<N; j++)
printf("%d ", h_c[j]);
printf("\n");
}
...全文
999 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
YCMyTot 2015-05-29
  • 打赏
  • 举报
回复
1.CPU端的时间计算可以用clock_t ,GPU 端一般使用 cudaEvent ,这个计算是将更准确一些。 2. 注意到你在计算时间的时候,把输出在屏幕上的时间也计算在内,这个貌似没有必要。 3. 你的数据组织成了一维的形式,每个block内128个线程,一共512个Block。开辟的Block太多了,一个Block内的线程开辟的有点少,建议组织成二维的形式,相比于一维的效果可能好很多。 4. 毕竟内核里面的运算量不大,相比于传输的时间,真正的用于计算的时间开销不是很大,在全局内存进行了3次地址索引对应着进行了一次的加法运算。
zhang543682672 2015-05-25
  • 打赏
  • 举报
回复
应该是主机内存和GPU之间数据传输占用了较长的时间
sbaban 2015-05-23
  • 打赏
  • 举报
回复
自顶一下,快来人啊

580

社区成员

发帖
与我相关
我的任务
社区描述
CUDA™是一种由NVIDIA推出的通用并行计算架构,该架构使GPU能够解决复杂的计算问题。 它包含了CUDA指令集架构(ISA)以及GPU内部的并行计算引擎。
社区管理员
  • CUDA编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧