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

红外回充方案之红外接收和发射/附源码(1)

本文介绍了基于NEC协议的红外回充方案实现,重点讲解了红外收发原理和GD32F330单片机的接收端实现。文章首先说明采用38kHz载波和一体化红外接收管的设计优势,能有效抗环境光干扰。接着详细解析NEC协议格式,包括9ms起始信号、地址码、命令码及其反码校验机制,并给出逻辑1和0的调制方式。在接收端实现上,展示了GD32F330定时器输入捕获配置代码,通过双边沿触发测量脉冲宽度进行解码。文章还提供了状态机设计思路和数据结构,为低成本机器人红外回充方案提供了完整的技术实现方案。

m0_59406757的博客 1241

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万+

深度理解嵌入(embedding)层

首先从one_hot开始: one_hot的优点:计算方便快捷、表达能力强。 one_hot的缺点:过于稀疏,过于占用资源,尤其是在数据量特别大时;数据之间完全独立。

weixin_44441131的博客 5661

点云配准实战:用DGCNN+Transformer+SVD搞定3D模型对齐(附PyTorch代码)

本文详细介绍了基于深度学习的点云配准实战方法,重点解析了Deep Closest Point (DCP)模型。该模型融合了DGCNN、Transformer和可微分SVD三大核心模块,能够端到端地预测点云间的刚性变换,有效克服传统ICP算法对初始位置敏感、易陷入局部最优的缺点。文章提供了完整的PyTorch代码实现、ModelNet40数据集处理、训练策略及显存优化技巧,旨在帮助开发者在机器人、自动驾驶等领域实现精准的3D模型对齐。

weixin_29061041的博客 155

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

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

u011826081的博客 4780

使用 MATLAB/Simulink + Simscape Electrical,构建一个含光伏并网系统与SVG的联合仿真模型,实现动态无功补偿与电压支撑

摘要:本文详细介绍了基于Simulink的SVG与光伏并网逆变器联合系统建模方法。通过构建包含光伏单元、SVG主电路和控制模块的仿真模型,实现动态无功补偿与电压稳定。重点阐述了ip-iq无功检测算法、双闭环控制和SVPWM调制等关键技术。仿真结果表明,该系统能快速响应无功需求,在10ms内将功率因数提升至0.98以上,有效抑制电压波动。文章为新能源并网系统中的电能质量治理提供了实用解决方案,并提出了进一步优化方向。

xiaoheshang_123的博客 322

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

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

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

液滴碰撞壁面的过程背景论文——bouncing反弹,spreading扩展,splashing飞溅。铺展过程介绍。还存在很多未解之谜。

【1993-德国-Phenomena of liquid drop impact on solid and liquid surfaces】液滴碰撞壁面的过程背景——bouncing反弹,spreading扩展,splashing飞溅。还存在很多未解之谜。还存在很多未解之谜。不同液滴形状碰撞过程。

qq_15963745的博客 200

SAP MD81创建客户独立需求简介

正常我们用的最多的计划独立需求都是使用的是MD61 ,今天我们说下SAP的另外的一个标准功能客户独立需求MD81。虽然SAP给这个TCODE的描述是客户独立需求,但是实际是没有地方去关联对应的客户信息的。可以看到根据客户需求产生了对应的计划订单,我们创建的时候选择的KSV是按库存生产的,所以转换的时候生产订单也按单生产的。上面填写的这些字段的信息是不是和我们销售订单里面的字段的信息很相似。1)填写交货日期,可以选择按月 ,按日,按周等类型选择对应的日期。保存后会显示对应的客户独立需求的号码,如下图。

我小时候很黑的博客 2904

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

C++怎么学?零基础也可以,一份完整学习路线图助你搞定!

提供一条清晰、系统且实践导向的C++学习路径。从基础语法、面向对象、泛型编程、异常处理,逐步深入STL、智能指针、并发编程等现代C++高级特性。无论是新手还是希望提升,通过系统学习与项目实践,助您将理论知识转化为实际解决问题的能力。

Lion_Long的博客 4029

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

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

gitblog_06724的博客 672

S7-1200PLC V90伺服绝对值编码器校准功能块

S7-1200PLC通过111报文和EPOS模式实现位置轴轴控功能(FB284封装)-优快云博客文章浏览阅读173次。EASY_SINA_POS的详细使用介绍请参考下面文章链接:S7-1200PLC使用标准报文111和EPOS模式实现V90 PN总线伺服定位(Easy_SINA_Pos)_西门子sinapos-优快云博客文章浏览阅读132次。文章浏览阅读7k次。先简单说下如何获取FB284,一般有2种方法,Startdrive软件可以操作大部分西门子的驱动器,建议安装调试方便,缺点就是软件太大。

RXXW_Dor的博客 969

温度PID控制PLC程序

温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值

《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

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

电子书下载: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

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

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、付费专栏及课程。

余额充值