C++多线程及CUDA编程(一)

一、前言

       这是我的第一篇博客,目的是记录在研究生阶段进行的多线程并行计算,主要用到的是VS2013与CUDA8.0,前者安装比较方便,后者配置起来有些麻烦,会遇到一些小问题导致无法进行Debug。希望我所分享的经验能够让我牢记其用法以及给对这方面有兴趣的人一些启发。

二、CUDA8.0的安装及配置

(1)首先请去点击打开链接下载CUDA8.0,选择合适版本。特别注意的network与local的区别,network是先下一个安装器,但是安装的时候需要联网下载,需要很长时间(博主连接超时),local就是下载完整的本地安装文件。

(2)开始安装请选择自定义安装并勾掉Driver components(如果不是3D绘图一类),然后进行安装。如果没有错误恭喜你,你非常幸运,你将会跳过如下步骤。

       如果显示安装失败,首先要记住软件CUDA Setup Package的存放目录,将此目录内的CUDAVisualStudioIntegration文件夹拷贝出来放到一个自己好找的地方,然后请勾掉CUDA->visual stdio integration这项进行安装。 如下图:

                         

       安装完毕后我们要完善Visaul Studio Integation的安装,打开VS2013我们发现,虽然上述VS已可以正常编译,但毕竟不是完整安装CUDA,因此缺失了VS中“新建CUDA解决方案”的功能,如下图:

       这时候只需要将之前保存的CUDAVisualStudioIntegration\extras\visual_studio_integration下的CudaProjectVsWizards文件夹整体拷贝到“D:\ProgramFiles\Microsoft Visual Studio 12.0\Common7\IDE\Extensions”下即可(请参考自己的目录),其中加粗部分为VS安装路径。重启VS,问题解决 。

       最后的最后,还可以把CUDAVisualStudioIntegration下的NVIDIA_Nsight_Visual_Studio_Edition_Win64_5.2.0.16321安装一下,它是CUDA给VS2013提供的一个调试插件。

(3)环境变量的设置。有关内容可以百度,并不困难。可参考此链接点击打开链接

(4)VS2013内配置CUDA。可参考此链接点击打开链接

       到此为止VS2013已经配置上CUDA了,可以愉快的进行CUDA之旅了。可以建立一个CUDA8.0的工程,添加一个.cu文件,进行简单的CUDA编程测试。例如简单的Hello World程序。

#include <stdio.h>
#include "device_launch_parameters.h"
#include "cuda_runtime.h"

__global__ void HelloFromGPU(void)
{
	printf("Hello World From GPU!\n");
}

int main(void)
{
	printf("Hello World From GPU!\n");

	HelloFromGPU <<<1, 10>>>();

	cudaDeviceReset();


	while (true)
	{
		
	}
	return 0;
}

三、C++11中的多线程

        针对多线程,首先要介绍几个定义,方便对多线程编程的理解。

      (1)并发,即多个任务同时执行,广泛用于提高吞吐率或提高响应能力;

      (2)线程(thread),线程是计算的概念在计算机硬件层面的抽象。在C++程序中多个任务需要并发执行时,就可以使用线程thread;

      (3)互斥量(mutex),互斥量是一种同步原语,是一种线程同步的手段,用来保护多线程同时访问的共享数据; 

       (4)原子变量(atomic),C++11提供了一个原子类型std::atomic<T>,可以使用任意类型作为模板参数,使用原子变量就不需要使用互斥量来保护变量,运用更加简洁。

        在开始多线程编程之前我们需要对thread库有一个了解,这个库包含了对线程的创建于管理。可以查阅这个网站了解有关知识http://www.cplusplus.com/reference/thread/thread/。其中thread内的成员函数有thread::get_id(获取线程ID),thread::join(阻塞式),thread::detach(分离式),thread::swap(交换线程);静态成员函数thread::hardware_concurrency用来获取当前主机的核心数,其数越高支持线程数越多。(多个子线程并行执行,join函数会阻塞主流程,所以子线程都执行完成之后才继续执行主线程。可以使用detach将子线程从主流程中分离,独立运行,不会阻塞主线程)下面是简单的创建线程及多线程的例子。

猜你喜欢

转载自blog.csdn.net/weixin_41330524/article/details/80852185
今日推荐