CUDA by example Chapter4 CUDA C并行编程

Julia分形 用cuda写了一下Julia分形 直接生成bmp (下次写个带交互的能放大缩小的#include "cuda_runtime.h" #include "device_launch_parameters.h"#include <iostream> #include <cmath> #include <iomanip> #include <fstream> #include <Windows.h> # 阅读详情

CPU矢量求和运算

/*
//代码4.2.1.1基于CPU的矢量求和运算
//时间:2019.07.20
*/
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>

#define N 10
void add(int *a, int *b, int *c)
{
	int tid = 0;//这是第0个CPU,因此索引从0开始
	while (tid < N)
	{
		c[tid] = a[tid] + b[tid];
		tid += 1;//由于只有一个CPU,因此每次递增1
	}
}

int main()
{
	int a[N], b[N], c[N];
	//在CPU上为数组'a'和'b'赋值
	for (int i = 0; i < N; i++)
	{
		a[i] = -i;
		b[i] = i*i;
	}

	add(a, b, c);
	//显示结果
	for (int i = 0; i < N; i++)
	{
		printf("%d + %d = %d\n", a[i], b[i], c[i]);
	}
	system("pause");
	return 0;
}

CPU代码中add()函数通过while循环对矢量a,b中N个元素串行依次加和并存储到矢量c中相应位置。

GPU矢量求和运算

/*
//代码4.2.1.2基于GPU的矢量求和运算
//时间:2019.07.20
*/
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>

#define N 10

__global__ void add(int *a, int *b, int *c)
{
	int tid = blockIdx.x;//计算位于这个索引处的数据
	if (tid < N)
		c[tid] = a[tid] + b[tid];
}


int main()
{
	int a[N], b[N], c[N];
	int *dev_a, *dev_b, *dev_c;

	//在GPU上分配内存
	cudaMalloc((void **)&dev_a, N*sizeof(int));
	cudaMalloc((void **)&dev_b, N*sizeof(int));
	cudaMalloc((void **)&dev_c, N*sizeof(int));

	//在CPU上为数组'a'和‘b’赋值
	for (int i = 0; i < N; i++)
	{
		a[i] = -i;
		b[i] = i*i;
	}

	//将数组'a'和'b'复制到GPU
	cudaMemcpy(dev_a, a, N*sizeof(int), cudaMemcpyHostToDevice);
	cudaMemcpy(dev_b, b, N*sizeof(int), cudaMemcpyHostToDevice);

	add << <N, 1 >> >(dev_a, dev_b, dev_c);

	//将数组'c'从GPU复制到CPU
	cudaMemcpy(c, dev_c, N*sizeof(int), cudaMemcpyDeviceToHost);

	//显示结果
	for (int i = 0; i < N; i++)
	{
		printf("%d + %d = %d\n", a[i], b[i], c[i]);
	}
	//释放在GPU上分配的内存
	cudaFree(dev_a);
	cudaFree(dev_b);
	cudaFree(dev_c);

	system("pause");
	return 0;
}

在这里插入图片描述
需要注意的是,上面的代码中使用了一些通用模式:
(1)调用cudaMalloc()在设备上未三个数组分配内存:在其中两个数组(dev_a和dev_b)中包含了输入值,而在数组dev_c中包含了计算结果。
(2)为了避免内存泄漏,在使用完GPU内存后通过cudaFree()释放他们。
(3)通过cudaMemcpy()将输入数据复制到设备中,同时指定参数cudaMemcpyHostToDevice,在计算完成后,将计算结果通过参数cudaMemcpyDeviceToHost复制回主机。
(4)通过尖括号语法,在主机代码main()中执行add()中的设备代码。

尖括号语法N,1说明

<<<N,1>>>
尖括号语法用于指定启动核函数的方式,其中第一个参数表示设备在执行核函数时使用的并行线程块block的数量,第二个参数表示一个block中线程thread的数量。
<<<N,1>>>说明在执行核函数的时候将创建核函数的N个副本,即N个block,每个block中只包含一个thread,并以并行的方式来运行它们。

通用尖括号语法gridsize,blocksize说明

<<<gridsize,blocksize>>>
一个GPU只能运行一个kernal,一个kernal就是一个grid,一个grid中可以包含多个block,一个block可以包含多个thread。

dim3 gridsize(1,2,3)
dim3 blocksize(4,5,6)
<<<gridsize,blocksize>>>

dim3是CUDA提供的用于指明三维结构的结构体类型,上述代码首先指明了grid以三维的形式组织,每一维包含的block数量分别为(1,2,3),接着指明了block也以三维的形式组织,每一维包含的thread数量分别为(4,5,6).
除此之外,dim3还可以以二维的形式组织甚至是一维的形式组织。

dim3 gridsize(7,8)
dim3 blocksize(9)

后面省略掉的维数将自动由编译器用1进行填充。

核函数说明

__global__ void add(int *a, int *b, int *c)
{
	int tid = blockIdx.x;//计算位于这个索引处的数据
	if (tid < N)
		c[tid] = a[tid] + b[tid];
}

其中,最重要的是内置变量blockIdx的使用。
blockIdx内包含三个成员变量,分别是x,y,z,用于指明当前核函数运行在哪个block中,由于上述<<<N,1>>>blocksize只有一维有效,因此单blockIdx.x就足以指明block的索引值。

基于CPU的Julia集

//代码4.2.2.1基于CPU的Julia集
//时间:2019.07.24
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include "cpu_bitmap.h"

#define DIM 1000

struct cuComplex{
	float r;
	float i;
	cuComplex(float a, float b) :r(a), i(b){}
	float magnitude2(void){ return r*r + i*i; }
	cuComplex operator*(const cuComplex& a)
	{
		return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i);
	}
	cuComplex operator+(const cuComplex& a)
	{
		return cuComplex(r + a.r, i + a.i);
	}
};

int julia(int x, int y)
{
	const float scale = 1.5;
	float jx = scale * (float)(DIM / 2 - x) / (DIM / 2);
	float jy = scale * (float)(DIM / 2 - y) / (DIM / 2);

	cuComplex c(-0.8, 0.156);
	cuComplex a(jx, jy);

	int i = 0;
	for (i = 0; i < 200; i++)
	{
		a = a*a + c;
		if (a.magnitude2()>1000)
			return 0;
	}
	return 1;

}

void kernal(unsigned char *ptr)
{
	for (int y = 0; y < DIM; y++)
	{
		for (int x = 0; x < DIM; x++)
		{
			int offset = x + y*DIM;
			int juliaValue = julia(x, y);
			ptr[offset * 4 + 0] = 255 * juliaValue;
			ptr[offset * 4 + 1] = 0;
			ptr[offset * 4 + 2] = 0;
			ptr[offset * 4 + 3] = 255;
		}
	}
}

int main()
{
	CPUBitmap bitmap(DIM, DIM);
	unsigned char *ptr = bitmap.get_ptr();
	kernal(ptr);
	bitmap.display_and_exit();

}

在这里插入图片描述
可以看到,Julia图案生成是逐像素的,生成速度很慢。
代码解释:
1.cuComplex

struct cuComplex{
	float r;
	float i;
	cuComplex(float a, float b) :r(a), i(b){}
	float magnitude2(void){ return r*r + i*i; }
	cuComplex operator*(const cuComplex& a)
	{
		return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i);
	}
	cuComplex operator+(const cuComplex& a)
	{
		return cuComplex(r + a.r, i + a.i);
	}
};

定义一个结构体用于保存复数值,其中r是实部,i是虚部,magnitude2()计算该复数的模值, operator*()对复数乘法进行重载, operator+()对复数加法进行重载。
2.julia()

int julia(int x, int y)
{
	const float scale = 1.5;
	float jx = scale * (float)(DIM / 2 - x) / (DIM / 2);
	float jy = scale * (float)(DIM / 2 - y) / (DIM / 2);

	cuComplex c(-0.8, 0.156);
	cuComplex a(jx, jy);

	int i = 0;
	for (i = 0; i < 200; i++)
	{
		a = a*a + c;
		if (a.magnitude2()>1000)
			return 0;
	}
	return 1;

}

给定想要计算的图像中的某一个点的位置(x,y),计算该点是否属于julia集合,如果属于则返回1,不属于则返回0.
函数首先将像素坐标转换为复数空间的坐标。为了将复平面的原点定位到图像中心,我们将像素位置移动了DIM/2.为了确保图像的范围为-1.0到1.0,我们将图像的坐标缩放了DIM/2倍。

然后,我们引入了一个scale因数来实现图形的缩放,当前,其被硬编码为1.5。

在计算出复数空间点之后通过计算迭代等式Zn+1=Zn2+C,其中C是任意一复数常量,选择值为-0.8+0.156i恰能够生成一张有趣的图片。

迭代计算200次,每次都判断模值是否大于阈值,如果大于阈值,认为等式是发散的,该点不属于Julia集,返回0,对图片中的这个点不着色。如果200次迭代之后模值仍然小于阈值,认为等式是收敛的,该点属于Julia集合,返回1,对图片中的这个点着色。
3.kernal()

void kernal(unsigned char *ptr)
{
	for (int y = 0; y < DIM; y++)
	{
		for (int x = 0; x < DIM; x++)
		{
			int offset = x + y*DIM;
			int juliaValue = julia(x, y);
			ptr[offset * 4 + 0] = 255 * juliaValue;
			ptr[offset * 4 + 1] = 0;
			ptr[offset * 4 + 2] = 0;
			ptr[offset * 4 + 3] = 255;
		}
	}
}

核函数对将要绘制的所有点进行迭代,并在每次迭代时调用julia来判断该点是否属于Julia集。如果该点位于集合中,那么函数julia()将返回1,否则将返回0。如果julia()返回1,那么就将点的颜色设置为红色,如果返回0则设置为黑色。

4.main()

int main()
{
	CPUBitmap bitmap(DIM, DIM);
	unsigned char *ptr = bitmap.get_ptr();
	kernal(ptr);
	bitmap.display_and_exit();
}

通过工具库创建了一个指定大小的位图图像,并将一个指向位图数据的指针传递给了核函数,核函数填充完这个位图图像之后对其进行显示。

基于GPU的Julia集

//代码4.2.2.2基于GPU的Julia集
//时间:2019.07.24
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <iostream>
#include "cpu_bitmap.h"

#define DIM 1000

struct cuComplex{
	float r;
	float i;
	__device__ cuComplex(float a, float b) :r(a), i(b){}//注意,这里的__device__是我自己添加的,指明构造函数也是运行在device上的
	__device__ float magnitude2(void){ return r*r + i*i; }
	__device__ cuComplex operator*(const cuComplex& a)
	{
		return cuComplex(r*a.r - i*a.i, i*a.r + r*a.i);
	}
	__device__ cuComplex operator+(const cuComplex& a)
	{
		return cuComplex(r + a.r, i + a.i);
	}
};

__device__ int julia(int x, int y)
{
	const float scale = 1.5;
	float jx = scale * (float)(DIM / 2 - x) / (DIM / 2);
	float jy = scale * (float)(DIM / 2 - y) / (DIM / 2);

	cuComplex c(-0.8, 0.156);
	cuComplex a(jx, jy);

	int i = 0;
	for (i = 0; i < 200; i++)
	{
		a = a*a + c;
		if (a.magnitude2()>1000)
			return 0;
	}
	return 1;

}

__global__ void kernal(unsigned char *ptr)
{
	//将threadIdx/blockIdx映射到像素位置
	int x = blockIdx.x;
	int y = blockIdx.y;
	int offset = x + y*gridDim.x;//这里需要注意的是blockIdx.x是二级索引,blockIdx.y是一级索引
	//计算这个位置上的值
	int juliaValue = julia(x, y);
	ptr[offset * 4 + 0] = 255 * juliaValue;
	ptr[offset * 4 + 1] = 0;
	ptr[offset * 4 + 2] = 0;
	ptr[offset * 4 + 3] = 255;
}

int main()
{
	CPUBitmap bitmap(DIM, DIM);
	unsigned char *dev_bitmap;
	cudaMalloc((void **)&dev_bitmap, bitmap.image_size());

	dim3 grid(DIM, DIM);
	kernal << <grid, 1 >> >(dev_bitmap);
	cudaMemcpy(bitmap.get_ptr(), dev_bitmap, bitmap.image_size(), cudaMemcpyDeviceToHost);
	bitmap.display_and_exit();
	cudaFree(dev_bitmap);
}

在这里插入图片描述

需要注意的是:
(1)__device__修饰符表明该函数必须由运行在GPU上的代码调用
(2)struct cuComplex中的构造函数前面也需要添加__device__修饰符,这是因为构造函数也是运行在device上的,原书中没有添加,编译会出错。
(3) blockIdx.x是二级索引,blockIdx.y是一级索引
int x = blockIdx.x;
int y = blockIdx.y;
所以int offset = x + y*gridDim.x;

实验发现,对比CPU版本,GPU版本并没有可观的速度提升。

本章小结

1.dim3 gridsize(1,2,3)
2.dim3 blocksize(4,5)
3,kernal<<<gridsize,blocksize>>>()
4.	blockIdx.x   			[0,0] 	范围
	blockIdx.y				[0,1]
	blockIdx.z				[0,2]
5.	threadIdx.x				[0,4]
	threadIdx.y				[0,3]
6.	gridDim.x				1		大小
	gridDim.y				2
	gridDim.z				3
7.	blockDim.x				4
	blockDim.y				5
8.	int offset = blockIdx.x + blockIdx.y*gridDim.x
	blockIdx.x是二级索引,blockIdx.y是一级索引
【Cuda Runtime】dim3线程块与网格尺寸与核函数几种调用的方式 CUDA(Compute Unified Device Architecture)是NVIDIA开发的一种并行计算架构,使得开发人员可以利用GPU进行通用计算。为了有效地利用GPU的并行处理能力,CUDA引入了网格(Grid)和线程块(Block)的概念。这些概念帮助开发人员将复杂的计算任务分解成多个可以并行执行的小任务,从而提高计算效率。本文将详细介绍什么是网格尺寸(Grid Size)和线程块(Block Size),以及如何使用dim3来定义它们。 阅读详情

相关推荐

CUDA编程实战:中文版教程案例分析

CUDA(Compute Unified Device Architecture)是NVIDIA推出的一种通用并行计算架构,它允许开发者利用NVIDIA的GPU来执行通用计算任务。CUDA提供了一套C语言风格的开发环境,让开发者能够使用C/C++语言编写程序,通过GPU强大的并行处理能力,加速科学计算、图形处理等任务的执行速度。

weixin_30600615的博客 1138

CUDA编程入门(一):以图片运算看线程的组织和核函数的使用

CUDA编程入门(一):以图片运算看线程的组织和核函数的使用 1. 线程块的组织 以二维图片处理为例,明确一下线程的组织与核函数调用时的使用。 现在需要对某一个图片(矩阵)的值进行运算,假设图片大小为ImgSize=ImgHeightImgWidth,则需要ImgSize个线程进行处理。 假如使用二维的线程块,则线程块数据结构为dim3 Block(BLOCK_SIZE,BLOCK_SIZE),表示线程块中线程数量为BLOCK_SIZEBLOCK_SIZE, 取BLOCK_SIZE=16。dim3 Bloc

qq_40491305的博客 899

一图文带您认识磁编码器

磁编码器是以磁电原理技术生产的编码器。 磁编码器工作原理: 当电流通过一个位于磁场中的导体的时候,磁场会对导体中的电子产生一个垂直于电子运动方向上的的作用力,从而在垂直于导体与磁感线的方向上产生电势差。 如果让施加在这个导体上的磁场以电流流经路径为轴线,按照上图箭头所示的方向旋转,那么这个霍尔电势差就会因为磁场与导体之间角度的改变而发生变化,而这个电势差的变化趋势,与之前一文中次级线圈旋转时的输出电压一样,是一条正弦曲线。因此,基于这个通电导体两侧的电压,就可以反推计算出磁场旋转的角度了。 .

encoder_yang的博客 2万+

GPU CUDA编程中threadIdx, blockIdx, blockDim, gridDim之间的区别与联系

在启动kernel的时候,要通过指定gridsize和blocksize才行,举下面的例子说说: dim3 gridsize(2,2); dim3 blocksize(4,4); gridsize相当于是一个2*2的block,gridDim.x,gridDim.y,gridDim.z相当于这个dim3的x,y,z方向的维度,这里是2*2*1。序号从0到3,且是从上到下的顺序,就是说是下面的情况:...

TH_NUM的博客 1万+

landsat8数据下载教程

下载landsat数据教程

weixin_44001203的博客 1万+

OTN设备核心知识速记

本文章为工作笔记,若有错误,还需大家指正。不定期更新。

Hiddengold的博客 2650

VS CUDA OpenCV编程 遇到gpu端核函数 应输入表达式的报错解决办法

最近在做开发时,用到了cuda和opencv结合的使用方法。其中,cuda能够提供的公式就那么多,所以打算自己写一个核函数来实现自己想要实现的算法。结果遇到了核函数调用的时候报错,提示应输入表达式。经过在网上查找,大家的解决办法基本上都说在cu文件中出现没事,可以通过。但是我这个就没法通过,经过最后的排查,找到了解决办法。通过以上方法则可以解决应输入表达式的报错。

u011826081的博客 4780

CXL Virtual Hierarchy (VH) Enumeration理解

在 CXL 3.0 协议中,CXL Virtual Hierarchy (VH) Enumeration 是一种针对 CXL 虚拟层级(Virtual Hierarchy) 设计的设备枚举机制,它允许软件将物理连接的 CXL 设备抽象为多个逻辑层级(虚拟层级),从而实现更灵活的资源管理和拓扑扩展。与传统的 PCIe 枚举相比,CXL VH 枚举在协议特性、拓扑抽象和资源分配机制上有显著差异。本质:VH 是一个逻辑上的设备层级结构,可能与物理连接拓扑不同。

Summer的博客 1005

CUDA By Example(三)——CUDA C并行编程

CUDA C并行编程,主要通过矢量求和与Julia集的绘制进行说明。以及对编译运行代码过程中遇到的问题及解决方案进行说明

hhhcbw的博客,欢迎各位来访 1542

AD20丝印层导入图片logo保姆级教程(附黑白预览避坑技巧)

本文提供了一份详尽的AD20丝印层导入图片Logo的实战指南。核心在于将图片预处理为高质量的单色BMP位图,并独家分享了利用Windows画图工具进行“黑白预览”的关键技巧,以提前规避转换失真。教程涵盖了从脚本获取、图片处理、参数设置到生产规范的完整流程,帮助硬件工程师高效、准确地在PCB的Top Overlay层添加个性化标识。

weixin_29194255的博客 386

ARM功耗管理之功耗状态及功耗模式

思考:功耗状态?功耗模式?Core&Cluster&Device&SoC如何映射?

AI-安全-功耗 785

CUDA by Example 源代码项目推荐

CUDA by Example 源代码项目推荐 1. 项目基础介绍和主要编程语言 CUDA by Example 是一个开源项目,旨在帮助开发者理解和使用CUDA技术。该项目包含了书籍《CUDA by Example》的所有示例代码,由两位NVIDIA的高级软件工程师Jason Sanders和Edward Kandrot编写。项目主要使用C、C++和CUDA作为编程语言,适合有一定编程基础的开发...

gitblog_01041的博客 528

【感知模块算法】障碍物detect+trace+prediction方向介绍

系列文章目录 提示:这里可以添加系列文章的所有文章的目录,目录需要自己手动添加 TODO:写完再整理 文章目录系列文章目录前言一、多维度看感知问题,体会复杂性二、障碍物/环境目标detect方向1.视觉目标检测方向(1)图像处理认知(2)视觉基础理论部分1、获取数据集---python网页爬虫、买数据、自己录数据、使用开源比赛的数据集2、opencv库的学习3、深度学习框架学习(3)视觉目标检测理论(1)目标检测的概念(2)目标检测的应用场景(3)现有目标检测框架原理及论文【这仅仅是我当初入门学习的框架~

qq_35635374的博客 2894

CUDA_BY_EXAMPLE头文件资源:为CUDA开发加速

CUDA_BY_EXAMPLE头文件资源:为CUDA开发加速 去发现同类优质开源项目:https://gitcode.com/ 项目介绍 在现代计算机科学领域,并行计算和图形渲染技术已成为不可或缺的技术手段。CUDA_BY_EXAMPLE 头文件资源正是为了满足这一需求而诞生的开源项目。它包含了一系列头文件,这些头文件是CUDA相关程序运行和开发的关键组成部分。通过提供与CUDA、OpenGL以及...

gitblog_06724的博客 672

lammps后处理:堆垛层错和孪晶的数量统计

python调用ovito包可以免费实现ovito pro版本的功能,不需要安装ovito pro软件,如统计位错线长度、CNA结构、键角分布等,如需深入学习,可考虑报名python ovito后处理课程,或lammps一对一课程。lammps金属变形模拟中,可能会产生堆垛层错或者孪晶等结构,但是ovito免费版本无法统计这些结构的数量。使用python和ovito软件包,则可以方便的统计出这些结构的数量。大家好,我是小马老师。

lammps_jiayou的博客 469

Data-Structures-and-Algorithm-Analysis-in-Java.pdf

作者: Weiss, Mark A. 出版社: Addison Wesley Data Structures and Algorithm Analysis in Java is an “advanced algorithms” book that fits between traditional CS2 and Algorithms Analysis courses. In the old ACM Curriculum Guidelines, this course was known as CS7. This text is for readers who want to learn good programming and algorithm analysis skills simultaneously so that they can develop such programs with the maximum amo...

《CUDA By Example》【Chapter 04】CUDA C 并行编程

GPU计算的应用前景在很大程度上取决于能否从很多问题中发掘出大规模并行性。 add_loop_cpu.cu #include &amp;amp;amp;amp;quot;../common/book.h&amp;amp;amp;amp;quot; #define N 10 void add( int *a, int *b, int *c ) { int tid = 0; // this is CPU zero, so we start at ze...

wondervictor的博客 299

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

电子书下载:CUDA by Example: An Introduction to General-Purpose GPU Programming

  Book DescriptionCUDA is a computing architecture designed to facilitate the development of parallel programs. In conjunction with a comprehensive software platform, the CUDA Architecture enables ...

weixin_33882452的博客 1215

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

CUDA by example Chapter3 CUDA C简介

CUDA C简介CPU上的Hello WorldGPU上的Hello World__global__修饰符:向kernal()中传递参数cudaMalloc()函数:cudaFree()函数:cudaMemcpy()函数:查询设备信息cudaGetDeviceCount()函数:结构体cudaDevicePropcudaGetDeviceProperties()函数:设备属性的使用:选择一个符合条...

wolfcsharp的博客 394

CUDA By Example(一)——为什么需要CUDA

主要介绍了并行计算,为什么需要CUDA,以及CUDA架构是什么

hhhcbw的博客,欢迎各位来访 1650

【亲测免费】 开源项目《cuda_by_example》常见问题解决方案

开源项目《cuda_by_example》常见问题解决方案 项目介绍及主要编程语言 《cuda_by_example》是一个开源项目,用于展示如何使用CUDA编程模型来编写并行计算程序。CUDA是NVIDIA推出的并行计算平台和编程模型,它允许开发者使用NVIDIA的GPU进行通用计算。该技术广泛应用于科学计算、图形处理、深度学习等领域。 该项目主要使用C/C++语言作为编程语言,并且需要对CUD...

gitblog_00527的博客 393

《GPU高性能编程 CUDA实战》(CUDA By Example)读书笔记

入门书籍,十分简单,看完就可以编写一些简单的CUDA程序了

每天get√新知识 1万+

CUDA By Example(八)——流

CUDA 流操作,使用Stream加速程序执行

hhhcbw的博客,欢迎各位来访 2823

Cuda By Example - 1

初学cuda

dairyman的专栏 1160

Cuda by Example 配置

Cuda by Example 真是一本好书,学习必备。 从网站下载源码:https://developer.nvidia.com/cuda-example 下载完解压,里边有一些动态库和作者自己写的头文件,注意一定要包含,否则运行必出错啊   之后解压文件到专用目录 F:\cuda_example   接着配置链接库   1:需要把.lib文件放入VS2013安装路径lib文件

runner668的博客 736

cuda编程思想和opencv_gpu图像处理

CUDA编程 https://github.com/Ewenwan/ShiYanLou/tree/master/CUDA CUDA(Compute Unified Device Architecture)的中文全称为计算统一设备架构。 高性能编程 笔记 GPU高性能编程CUDA实战 CUDA与OpenCV实战,用于加速计算机视觉 并行机器编程 CUDA自带文档:CUDA_C_Programming_Guide pycuda CUDA编程之快速入门!!!!!推荐 参考 参考2 参考3...

爱CV 3926

《CUDA 学习之旅:cuda_by_example 项目推荐》

《CUDA 学习之旅:cuda_by_example 项目推荐》 本项目是基于 Yannnnnnnnnnnn 的 cuda_by_example,一个使用 CMake 构建系统的开源项目。该项目主要使用 CUDA 和 C++ 编程语言。 项目基础介绍 cuda_by_example 项目是对 CUDA 编程的实践教程,它基于 NVIDIA 提供的 CUDA 示例代码,并通过 CMake 构建系统进...

gitblog_00045的博客 401
上一篇: CUDA by example Chapter3 CUDA C简介
下一篇: 视觉SLAM十四讲 读书编程笔记 Chapter 1&2
Leo-Ma
博客等级 码龄11年 1701粉丝 124原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值