热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

CUDA并行、GLSL并行、CPU并行相互转换

以一个博文《CUDA例子》来说明。#includecuda_runtime.h#includedev

以一个博文《CUDA例子》来说明。


#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include
#define N 10
__global__ void add(int *a, int *b, int *c)
{
int tid =blockIdx.x;
c[tid] = a[tid] + b[tid];
}
int main()
{
int a[N], b[N], c[N];
int *deva, *devb, *devc;
//在GPU上分配内存
cudaMalloc((void **)&deva, N*sizeof(int));
cudaMalloc((void **)&devb, N*sizeof(int));
cudaMalloc((void **)&devc, N*sizeof(int));
//在CPU上为数组赋值
for (int i = 0; i {
a[i] = -i;
b[i] = i*i;
}
//将数组a和b传到GPU
cudaMemcpy(deva, a, N*sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(devb, b, N*sizeof(int), cudaMemcpyHostToDevice);
cudaMemcpy(devc, c, N*sizeof(int), cudaMemcpyHostToDevice);
add <<> >(deva, devb, devc);
//将数组c从GPU传到CPU
cudaMemcpy(c, devc, N*sizeof(int), cudaMemcpyDeviceToHost);
for (int i = 0; i {
printf("%d+%d=%d\n", a[i], b[i], c[i]);
}
cudaFree(deva);
cudaFree(devb);
cudaFree(devc);
return 0;
}

cpu

//#include "cuda_runtime.h"
//#include "device_launch_parameters.h"
#include
#define N 10
//加一个全局并行变量
int blockIdx_x;
//__global__
void add(int *a, int *b, int *c)
{
int tid =blockIdx_x;//blockIdx.x;
c[tid] = a[tid] + b[tid];
}
int main()
{
int a[N], b[N], c[N];
int *deva, *devb, *devc;
// //在GPU上分配内存
// cudaMalloc((void **)&deva, N*sizeof(int));
// cudaMalloc((void **)&devb, N*sizeof(int));
// cudaMalloc((void **)&devc, N*sizeof(int));
//在CPU上为数组赋值
for (int i = 0; i {
a[i] = -i;
b[i] = i*i;
}
// //将数组a和b传到GPU
// cudaMemcpy(deva, a, N*sizeof(int), cudaMemcpyHostToDevice);
// cudaMemcpy(devb, b, N*sizeof(int), cudaMemcpyHostToDevice);
// cudaMemcpy(devc, c, N*sizeof(int), cudaMemcpyHostToDevice);
deva = a; devb = b; devc = c;
for (int blockIdx_x = 0; blockIdx_x {
//<<> >
add (deva, devb, devc);
//add (a, b, c);//也可以直接这句
}
// //将数组c从GPU传到CPU
// cudaMemcpy(c, devc, N*sizeof(int), cudaMemcpyDeviceToHost);
for (int i = 0; i {
printf("%d+%d=%d\n", a[i], b[i], c[i]);
}
// cudaFree(deva);
// cudaFree(devb);
// cudaFree(devc);
return 0;
}

对于OpenMP 加上 “#pragma omp parallel for”就是CPU并行了


总结:

1。去掉数据从cpu-->gpu 和 gpu-->cpu 的相关代码

2。核函数作为cpu并行对象放到for循环中

3。把双角括号<<>>的数据变为for的循环变量

------------------------------------------------------分割线----------------------------------------------------

glsl

先来对比一下glsl 和 cuda 计算单位结构图

 

可见,除了名称叫法不同,组成方式是一样的。

//#include "cuda_runtime.h"
//#include "device_launch_parameters.h"
#include
#define N 10


//__global__
//void add(int *a, int *b, int *c)
//{
// int tid =blockIdx_x;//blockIdx.x;
// c[tid] = a[tid] + b[tid];
//
//}
//核函数放入Source中,作为glsl源码
char *Source={
"#version 430 core\n"
"layout (local_size_x = LOCAL_SIZE_X, local_size_y = LOCAL_SIZE_Y, local_size_z = 1) in;\n"
"layout(std430, binding = 0) buffer buffer0\n"
"{\n"
" int a[];\n"
"};\n"
"layout(std430, binding = 1) buffer buffer1\n"
"{\n"
" int b[];\n"
"};\n"
"layout(std430, binding = 2) buffer buffer2\n"
"{\n"
" int c[];\n"
"};\n"
"void main(void)\n"
"{\n"
" int tid =int(gl_WorkGroupID.x);\n"
" c[tid] = a[tid] + b[tid];\n"
"}\n"
}
int main(int argc,char **argv)
{
//glsl 初始化
init_glut_glew(argc,argv);
int a[N], b[N], c[N];
int *deva, *devb, *devc;
// //在GPU上分配内存
// cudaMalloc((void **)&deva, N*sizeof(int));
// cudaMalloc((void **)&devb, N*sizeof(int));
// cudaMalloc((void **)&devc, N*sizeof(int));
分配glsl缓存ID();//glGenBuffers()
//分配缓存 和传送数据一起

//在CPU上为数组赋值
for (int i = 0; i {
a[i] = -i;
b[i] = i*i;
}
// //将数组a和b传到GPU
// cudaMemcpy(deva, a, N*sizeof(int), cudaMemcpyHostToDevice);
// cudaMemcpy(devb, b, N*sizeof(int), cudaMemcpyHostToDevice);
// cudaMemcpy(devc, c, N*sizeof(int), cudaMemcpyHostToDevice);
传送数组(a,b,c,N*sizeof(int));
//glBindBuffer();glBufferData();glBindBufferBase();glUnmapBuffer();

设置glsl运行参数(N);
//local_size_x = N, local_size_y = 1, local_size_z = 1;//代入Source中
//NumGroupsX = 1, NumGroupsY = 1, NumGroupsZ = 1;

编译链接源码(Source);
//glCompileShader();glLinkProgram()
运行计算着色器();
//performCompute();
//add (deva, devb, devc);

// //将数组c从GPU传到CPU
// cudaMemcpy(c, devc, N*sizeof(int), cudaMemcpyDeviceToHost);
取回结果(c);
//glBindBuffer();glMapBuffer();glUnmapBuffer();
for (int i = 0; i {
printf("%d+%d=%d\n", a[i], b[i], c[i]);
}
// cudaFree(deva);
// cudaFree(devb);
// cudaFree(devc);
return 0;
}

总结:

1。核函数作为源码放入一个字符串中

2。计算单位的设置都有对应的名称代入

3。分配存储传送取回数据也有对应的函数

 

 


推荐阅读
  • 本文整理了一份基础的嵌入式Linux工程师笔试题,涵盖填空题、编程题和简答题,旨在帮助考生更好地准备考试。 ... [详细]
  • iOS 不定参数 详解 ... [详细]
  • 本文详细介绍了 Java 网站开发的相关资源和步骤,包括常用网站、开发环境和框架选择。 ... [详细]
  • 小程序的授权和登陆
    小程序的授权和登陆 ... [详细]
  • malloc 是 C 语言中的一个标准库函数,全称为 memory allocation,即动态内存分配。它用于在程序运行时申请一块指定大小的连续内存区域,并返回该区域的起始地址。当无法预先确定内存的具体位置时,可以通过 malloc 动态分配内存。 ... [详细]
  • 本文详细介绍了Java反射机制的基本概念、获取Class对象的方法、反射的主要功能及其在实际开发中的应用。通过具体示例,帮助读者更好地理解和使用Java反射。 ... [详细]
  • 本文介绍了在 iOS 开发中设置图片和视图圆角的几种方法,包括通过 layer 设置圆角、使用贝塞尔曲线和 Core Graphics 框架,以及使用 CAShapeLayer 和 UIBezierPath。每种方法都有其优缺点,适用于不同的场景。 ... [详细]
  • PHP 5.5.31 和 PHP 5.6.17 安全更新发布
    PHP 5.5.31 和 PHP 5.6.17 已正式发布,主要包含多个安全修复。强烈建议所有用户尽快升级至最新版本以确保系统安全。 ... [详细]
  • Quora问题探讨:26岁开始转行做开发是否太迟? ... [详细]
  • 本文介绍了如何在Python中使用插值方法将不同分辨率的数据统一到相同的分辨率。 ... [详细]
  • 兆芯X86 CPU架构的演进与现状(国产CPU系列)
    本文详细介绍了兆芯X86 CPU架构的发展历程,从公司成立背景到关键技术授权,再到具体芯片架构的演进,全面解析了兆芯在国产CPU领域的贡献与挑战。 ... [详细]
  • 本文节选自《NLTK基础教程——用NLTK和Python库构建机器学习应用》一书的第1章第1.2节,作者Nitin Hardeniya。本文将带领读者快速了解Python的基础知识,为后续的机器学习应用打下坚实的基础。 ... [详细]
  • 【妙】bug称它为数组越界的妙用
    1、聊一聊首先跟大家推荐一首非常温柔的歌曲,跑步的常听。本文主要把自己对C语言中柔性数组、零数组等等的理解分享给大家,并聊聊如何构建一种统一化的学习思想 ... [详细]
  • 通过将常用的外部命令集成到VSCode中,可以提高开发效率。本文介绍如何在VSCode中配置和使用自定义的外部命令,从而简化命令执行过程。 ... [详细]
  • C语言中全部可用的数学函数有哪些?2.longlabs(longn);求长整型数的绝对值。3.doublefabs(doublex);求实数的绝对值。4.doublefloor(d ... [详细]
author-avatar
无声胜有剩
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有