新手问下关于CUDA效率的问题

a5680737 a5680737 墨衍会员 · AI 创作全网分发 墨衍智能分发 通过墨衍一键同步至各平台 可同步平台 CSDN微信公众号微博知乎掘金百家号博客园抖音小红书 你的文章也可以这样分发 墨衍会员 ¥399起/年,写一次发全网 我也要 + 加入社区
试了一下一个简单的矩阵相加的并行程序 感觉效率非常低下 主要是memcpy和malloc太费时间了 求教一下各位大神这种问题怎么解决?是由于计算量太少还是我代码的问题?
__global__ void addKernel(int *c, const int *a, const int *b)
{
int i = blockIdx.x;
int j = threadIdx.x;
int idx = i*blockDim.x+j;
c[idx] = a[idx] * b[idx];
c[idx] += a[idx] * b[idx];
}
const int arraySize = 100;
int main()
{
int a[arraySize][arraySize];
int b[arraySize][arraySize];
int c[arraySize][arraySize];
int c1[arraySize][arraySize];

for(int i = 0;i<arraySize;i++)
{
for(int j = 0;j<arraySize;j++)
{
a[i][j] = i;
b[i][j] = 2*i;
}
}
cudaError_t cudaStatus;
// Choose which GPU to run on, change this on a multi-GPU system.
cudaStatus = cudaSetDevice(0);

clock_t t1 = clock();

int *dev_a = 0;
int *dev_b = 0;
int *dev_c = 0;
// Allocate GPU buffers for three vectors (two input, one output) .
cudaStatus = cudaMalloc((void**)&dev_c, arraySize * arraySize * sizeof(int));

cudaStatus = cudaMalloc((void**)&dev_a, arraySize * arraySize * sizeof(int));

cudaStatus = cudaMalloc((void**)&dev_b, arraySize * arraySize * sizeof(int));

// Copy input vectors from host memory to GPU buffers.
cudaStatus = cudaMemcpy(dev_a, a, arraySize * arraySize * sizeof(int), cudaMemcpyHostToDevice);

cudaStatus = cudaMemcpy(dev_b, b, arraySize * arraySize * sizeof(int), cudaMemcpyHostToDevice);

// Launch a kernel on the GPU with one thread for each element.
addKernel<<<arraySize, arraySize>>>(dev_c, dev_a, dev_b);


// Check for any errors launching the kernel
cudaStatus = cudaGetLastError();

// cudaDeviceSynchronize waits for the kernel to finish, and returns
// any errors encountered during the launch.
cudaStatus = cudaDeviceSynchronize();

// Copy output vector from GPU buffer to host memory.
cudaStatus = cudaMemcpy(c, dev_c, arraySize * arraySize * sizeof(int), cudaMemcpyDeviceToHost);

clock_t t2 = clock();
cout<<"time:"<<t2-t1<<endl;

for(int i = 0;i<arraySize;i++)
{
for(int j = 0;j<arraySize;j++)
{
c1[i][j] = a[i][j] + b[i][j];
c1[i][j] += a[i][j] * b[i][j];
c1[i][j] += a[i][j] * b[i][j];
c1[i][j] += a[i][j] * b[i][j];
}
}
t1 = clock();
cout<<"time:"<<t1-t2<<endl;
cudaFree(dev_c);
cudaFree(dev_a);
cudaFree(dev_b);
cudaStatus = cudaDeviceReset();

return 0;
}



以上是代码和运行截图 谢谢各位大神了!
...全文

相关推荐

浅谈pytorch、cuda、python的版本对齐问题

本文将详细介绍在使用PyTorch框架时CUDA和Python版本的对齐问题,这将有助于我们更好地配置训练环境,避免一些不必要的麻烦。

weixin_38670208

CUDA C/C++ 新手入门代码练习

本篇将基于"CUDA C/C++ 新手入门代码练习"这个主题,详细介绍CUDA编程的基础知识,包括CUDA架构、编程模型、内存管理以及编程技巧。

FOR_BH

Thrust:一个面向效率的CUDA编程库

这为开发者在使用CUDA进行编程时提供了宝贵的帮助,大大简化了并行计算的复杂性,并提高了程序的开发效率和运行效率。

yangailin12138

cuda-TSP:使用 CUDA 扩展在 C 中实现旅行商问题

本项目“cuda-TSP”就是将CUDA技术应用到旅行商问题的求解中,以提高计算效率。1.

胡説个球

提升CUDA程序运行效率的几个关键点

最近由于项目需要,需要用MPI+CUDA混合编程提高程序运行效率。相对于MPI并行程序编程,要想充分利用CUDA的资源利用率,还是要考虑很多方面的内容,根据查找的一些相关资料,将提升GPU显卡吞吐率以及利用效率的方法归纳如下,如有问题,敬请批评指正。下面是进行CUDA编程的大致流程,为了避免混乱,会将相关的详细内容放到链接所示的位置。 1、明确计算机中GPU卡片的计算资源,决定变量的性质(constant,share还是global)以及Grid,Block的维度 ...

Innerpeace_yu
评论 4
收藏 已收藏
分享
返回顶部
a5680737
CUDA 591 成员 2,925 内容