① c语言 gpu
U越来越强大,GPU为显示图像做了优化之外,在计算上已经超越了通用的CPU。如此强大的芯片如果只是作为显卡就太浪费了,因此NVidia推出CUDA,让显卡可以用于图像计算以外的目的,也就是超于游戏,使得GPU能够发挥其强大的运算能力。
一年前NVIDIA发布CUDA,这是一种专门针对GPU的C语言开发工具。与以往采用图形API接口指挥GPU完成各种运算处理功能不同,CUDA的出现使研究人员和工程师可以在熟悉的C语言环境下,自由地输入代码调用GPU的并行处理架构。这使得原先需要花费数天数周才能出结果的运算大大缩短到数几小时,甚至几分钟之内。
CUDA是用于GPU计算的开发环境,它是一个全新的软硬件架构,可以将GPU视为一个并行数据计算的设备,对所进行的计算进行分配和管理。在CUDA的架构中,这些计算不再像过去所谓的GPGPU架构那样必须将计算映射到图形API(OpenGL和Direct 3D)中,因此对于开发者来说,CUDA的开发门槛大大降低了。CUDA的GPU编程语言基于标准的C语言,因此任何有C语言基础的用户都很容易地开发CUDA的应用程序。
那么,如何使得CPU与GPU之间很好的进行程序之间的衔接呢?以GPGPU的概念来看,显卡仍然需要以传统的DirectX和OpenGL这样的API来实现,对于编程人员来说,这样的方法非常繁琐,而CUDA正是以GPGPU这个概念衍生而来的新的应用程序接口,不过CUDA则提供了一个更加简便的方案——C语言。我们回顾一下CUDA的发展历史。
② 请问各位大神 现在总说cuda什么的好 销售人员也总说显卡有cuda 怎么怎么样的 cuda到底是什么 有啥好处
CUDA有两个含义。
一是指CUDACore。即CUDA核心,NVIDIA显卡从Fermi架构起开始采用,Kepler架构亦沿用。CUDA核心是架构中最核心部分也是数量占绝对优势的部分,其实际上就是一个ALU,习惯上也可以叫做流处理器,是N卡的最基本运算单元。Fermi架构通常每组SM单元包含48个CUDACore,而Kepler架构每组SMX则包含192个。CUDACore的数量规模从根本上直接决定显卡的运算规模,也直接影响显卡的性能。GPU-Z中N卡的“着色器数量”(Shaders)里的数值即为CUDA核心的数量(注意仅限于Fermi和Kepler架构)。下面简单附上一张GK104核心剖析图,图中每个绿色小方块都代表一个CUDA核心。想要深入了解CUDA核心的工作原理还需要理解架构原理,这里不再介绍。
二是指CUDA环境,CUDA全称,是NVIDIA推行的一种通用计算架构,与OpenCL、DirectCompute等一样也是API的一种,基于C语言开发,特别针对CUDA核心架构的GPU开发,包含了多种先进的通用技术技术,例如并行架构等等。程序开发人员可以利用CUDA平台实现NVIDIA显卡的通用计算,利用GPU来参与大规模运算。
CUDA计算多用于专业领域,消费级市场应用不大。销售人员借此概念玩悬乎罢了。
③ 关于cuda编程的,新手!糊里糊涂的,麻烦帮下忙!这是我自己写的一个程序,编译以后的结果!
#ifndef
#endif
要同时出现
④ 编程学习必看的书
一、《Web前端开发最佳实践》
这本书是前端开发领域的经典之作,是一本扎实前端基本功,规范我们前端代码的实践性书籍。本书主要讲解了HTML、CSS、Javascript以及移动端开发的最佳实践方案,能够对缺乏良好指导的开发者产生很大的帮助。通过阅读本书我们可以掌握如何编写高可读性、高维护性、高性能的HTML、CSS以及Javascript。
二、《CSS那些事儿》
内容介绍:《CSS那些事儿》是2009年电子工业出版社出版的图书,作者是林小志。该书通过对CSS技巧实例进行讲解,浅入深地分析了CSS相关知识。
通过页面中的文字、图片、表格、表单等常见元素的处理及各种页面布局方式的使用,使读者能深入了解到如何在页面中更好地运用CSS布局。尤其是在页面布局的部分中,全面分析了多种布局方式,着重分解了两列等高和三列等高的几种方式,并相应说明了等高布局的优缺点。
三、《CSS权威指南》
内容介绍:《CSS权威指南》通过诸多实例,详细讲解了如何做到仅在一处建立样式表就能创建或修改整个网站的外观,以及如何得到html力不能及的更丰富的表现效果。同时展示了如何遵循css最新规范(css2和css2.1)将层叠样式表的方方面面应用于实践。
七、HTTP权威指南
内容介绍:《HTTP权威指南》由古尔利所著,《HTTP权威指南》详细解释了如何用HTTP来开发基于Web的应用程序,核心的[因特网协议,如何与架构构建块交互,如何正确实现因特网客户和服务器等。
《HTTP权威指南》的中心内容是HTTP,本质是理解Web的工作原理,以及如何将这些知识应用到Web编程和管理之中,主要涵盖HTTP的技术运作方式、产生动机、性能和目标以及一些相关技术问题。 《HTTP权威指南》适合所有想了解HTTP和Web底层结构的人阅读。
八、高性能网站建设指南
内容介绍:《高性能网站建设指南》结合Web2.0以来Web开发领域的最新形势和特点,介绍了网站性能问题的现状、产生的原因,以及改善或解决性能问题的原则、技术技巧和最佳实践。重点关注网页的行为特征,阐释优化Ajax、CSS、JavaScript、Flash和图片处理等要素的技术,全面涵盖浏览器端性能问题的方方面面。
⑤ 关于编程的书籍
《程序员修炼之道》由一系列的独立部分组成,涵盖的主题从个人责任、职业发展,直到用于使代码保持灵活、并且易于改编和复用的各种架构技术。利用许多富有娱乐性的奇闻轶事、有思想性的例子以及有趣的类比,全面阐释了软件开发的许多不同方面的最佳实践和重大陷阱。无论你是初学者,是有经验的程序员,还是软件项目经理,本书都适合你阅读。
代码整洁之道
作者:Robert C. Martin,66% 推荐度
软件质量,不但依赖于架构及项目管理,而且与代码质量紧密相关。这一点,无论是敏捷开发流派还是传统开发流派,都不得不承认。本书提出一种观念:代码质量与其整洁度成正比。干净的代码,既在质量上较为可靠,也为后期维护、升级奠定了良好基础。作为编程领域的佼佼者,本书作者给出了一系列行之有效的整洁代码操作实践。这些实践在本书中体现为一条条规则(或称“启示”),并辅以来自现实项目的正、反两面的范例。只要遵循这些规则,就能编写出干净的代码,从而有效提升代码质量。
代码大全(第 2 版)
作者:Steve McConnell,42% 推荐度
这是一本完整的软件构建手册,涵盖了软件构建过程中的所有细节。它从软件质量和编程思想等方面论述了软件构建的各个问题,并详细论述了紧跟潮流的新技术、高屋建瓴的观点、通用的概念,还含有丰富而典型的程序示例。这本书中所论述的技术不仅填补了初级与高级编程技术之间的空白,而且也为程序员们提供了一个有关编程技巧的信息来源。这本书对经验丰富的程序员、技术带头人、自学的程序员及几乎不懂太多编程技巧的学生们都是大有裨益的。可以说,无论是什么背景的读者,阅读这本书都有助于在更短的时间内、更容易地写出更好的程序。
重构:改善既有代码的设计
作者:Martin Fowler,35% 推荐度
重构,一言以蔽之,就是在不改变外部行为的前提下,有条不紊地改善代码。多年前,正是本书原版的出版,使重构终于从编程高手们的小圈子走出,成为众多普通程序员日常开发工作中不可或缺的一部分。本书也因此成为与《设计模式》齐名的经典著作,被译为中、德、俄、日等众多语言,在世界范围内畅销不衰。
深入浅出设计模式
作者:Eric Freeman / Bert Bates / Kathy Sierra / Elisabeth Robson,29.4% 推荐度
《深入浅出设计模式》(影印版) 的编写运用许多最新的研究,包括神经生物学、认知科学以及学习理论,这使得《深入浅出设计模式》(影印版) 能够将这些设计模式深深地烙印在你的脑海中,不容易被遗忘。你将会更擅长于解决软件设计中的问题,并能够和你的团队成员用模式的语言来更好地沟通。
人月神话
作者:Frederick P. Brooks Jr,27.9% 推荐度
作者为人们管理复杂项目提供了颇具洞察力的见解,既有很多发人深省的观点,也有大量的软件工程实践。书中的内容来自布鲁克斯在 IBM 公司 System 360 家族和 OS 360 中的项目管理经验。初版的 20 年后,布鲁克斯重新审视了他原先的观点,增加了一些新的想法和建议。新增加的章节包括:原著中一些核心观点的精华;在经过了一个时代以后,Brooks 博士对原先观点新的认识;1986 年的经典文章《没有银弹》;对 1986 年所下论断(在 10 年内不会出现银弹)现在的认识。
⑥ 如何进行CUDA C程序核函数的调试
由于CUDA调试工具的不完善、CUDA调试工具上手难度较高,并行思想本身就难调试等因素,CUDA调试一直都是一件很蛋疼的事情。写CUDA也有三四年了,前段时间在群里见别人问CUDA调试的问题,突然有想法写个CUDA调试的博客。自己经验尚浅,希望各位大大看过后能够在评论里指点一二,共同完善这篇博客。
本博客只针纤友对逻辑bug。
1 定位bug
出现bug的第一想法自然是定位bug。cuda比较奇特的地方在于,有时报错bug在500行,但500行出的代码没有错误,而是在1000行的地方逻辑错了,十分头疼。
下面介绍三种我总结的定位bug方法:
1.1 二分法
一半一半的注释代码,定位bug。比较笨拙和麻烦,但是十分好用。
1.2 输出定位法
将整体代码分为几个模块,正常的CUDA代码大概可以分为数据初始化,内存申请,内存拷贝,核函数执行,结果拷贝等模块。在每个模块结束后输出标志,示例如图1。这样在调试时就可以根据输出快速定位bug大约在什么位置。如下图:
⑦ 如何学习cuda c
1、CUDAC编写WindowsConsoleApplication
下面我们从一个简单的例子开始学习CUDAC。
打开VS,新建一个CUDAWinApp项目,项目名称为Vector,解决方案名称为CUDADemo。依次点击“确定”,“下一步”,选择Emptyproject。点击“Finished”。这样一个CUDA的项目就建成了。
右键点击Vector项目,依次选择“添加”、“新建项”、“代码”、“CUDA”。在名称中输入要添加的文件名。如Vector.cu。然后点击添加。
下面在Vector.cu文件里实现两个向量相加的程序。
//添加系统库
#include
#include
//添加CUDA支持
#include
__global__voidVecAdd(float*A,float*B,float*C);
__host__voidrunVecAdd(intargc,char**argv);
intmain(intargc,char**argv)
{
runVecAdd(argc,argv);
CUT_EXIT(argc,argv);
}
__host__voidrunVecAdd(intargc,char**argv)
{//初始化host端内存数据
constunsignedintN=8;//向量维数
constunsignedintmemSize=sizeof(float)*N;//需要空间的字节数
float*h_A=(float*)malloc(memSize);
float*h_B=(float*)malloc(memSize);
float*h_C=(float*)malloc(memSize);
for(unsignedinti=0;i<N;i++)
{h_A[i]=i;h_B[i]=i;}
//设备端显存空间
float*d_A,*d_B,*d_C;
//初始化Device
CUT_DEVICE_INIT(argc,argv);
CUDA_SAFE_CALL(cudaMalloc((void**)&d_A,memSize));
CUDA_SAFE_CALL(cudaMalloc((void**)&d_B,memSize));
CUDA_SAFE_CALL(cudaMalloc((void**)&d_C,memSize));
CUDA_SAFE_CALL(cudaMemcpy(d_A,h_A,memSize,cudaMemcpyHostToDevice));
CUDA_SAFE_CALL(cudaMemcpy(d_B,h_B,memSize,cudaMemcpyHostToDevice));
VecAdd<<<1,N,memSize>>>(d_A,d_B,d_C);
CUT_CHECK_ERROR("Kernelexecutionfailed");
CUDA_SAFE_CALL(cudaMemcpy(h_C,d_C,memSize,cudaMemcpyDeviceToHost));
for(unsignedinti=0;i<N;i++)
{printf("%.0f",h_C[i]);}
free(h_A);free(h_B);free(h_C);
CUDA_SAFE_CALL(cudaFree(d_A));
CUDA_SAFE_CALL(cudaFree(d_B));
CUDA_SAFE_CALL(cudaFree(d_C));
}
__global__voidVecAdd(float*A,float*B,float*C)
{
//分配sharedmemory
extern__shared__floats_A[];
extern__shared__floats_B[];
extern__shared__floats_C[];
//从globalmemory拷贝到sharedmemory
constunsignedinti=threadIdx.x;
s_A[i]=A[i];
s_B[i]=B[i];
//计算
s_C[i]=s_A[i]+s_B[i];
//拷贝到globalmemory
C[i]=s_C[i];
}
由于这里不是讲CUDA编程的,关于它的编程模型已经超出了我要介绍的范围,您可以阅读《GPU高性能运算之CUDA》来获得CUDA编程模型的知识。
编译Vector项目,执行此项目后会得到图1如下输出:
图1Vector项目执行结果
2、CUDAC编写DLL模块
更多情况下的您的软件可能只是使用CUDA来实现一段程序的加速,这种情况下我们可以使用CUDAC编写DLL来提供接口。下面我们就将例1编译成DLL。
在刚才的CUDADemo解决方案目录下添加一个新的CUDA项目(当然您也可以重新建立一个解决方案)。项目名为VecAdd_dynamic。ApplicationType选为DLL,AdditionalOptions选择EmptyProject。
第一步,添加头文件,文件名最好与工程名同名,这样便于您的维护工作。这里我向项目中添加了VecAdd_dynamic.h,在此头文件中添加如下代码
#ifndef_VECADD_DYNAMIC_H_
#define_VECADD_DYNAMIC_H_
//并行计算N维向量的加法
__declspec(dllexport)voidVecAdd(float*h_A,float*h_B,float*h_C,intN);
#endif
第二步,添加cpp文件,文件名为VecAdd_dynamic.cpp,在此文件中添加如下代码
#include
#include"VecAdd_dynamic.h"
#ifdef_MANAGED
#pragmamanaged(push,off)
#endif
BOOLAPIENTRYDllMain(HMODULEhMole,DWORDul_reason_for_call,LPVOIDlpReserved)
{
returnTRUE;
}
#ifdef_MANAGED
#pragmamanaged(pop)
#endif
第三步,添加def文件,此文件的功能就是确保其它厂商的编译器能够调用此DLL里的函数。这一点非常关键,因为您的程序可能用到多个厂家的编译器。文件名为VecAdd_dynamic.def。向该文件中添加:
EXPORTS
VecAdd
第四步,添加cu文件,文件名为VecAdd_dynamic.cu。注意此文件最好直接添加到项目目录下,不要添加到源文件选项卡或其它已有的选项卡下。
在cu文件里添加如下代码,实现要导出的函数。
#include
#include
#include
#if__DEVICE_EMULATION__
boolInitCUDA(void)
{returntrue;}
#else
boolInitCUDA(void)
{
intcount=0;
inti=0;
cudaGetDeviceCount(&count);
if(count==0)
{
fprintf(stderr,"Thereisnodevice./n");
returnfalse;
}
for(i=0;i<count;i++)
{
cudaDevicePropprop;
if(cudaGetDeviceProperties(&prop,i)==cudaSuccess)
{
if(prop.major>=1)
{break;}
}
}
if(i==count)
{
fprintf(stderr,"ThereisnodevicesupportingCUDA./n");
returnfalse;
}
cudaSetDevice(i);
printf("CUDAinitialized./n");
returntrue;
}
#endif
__global__voidD_VecAdd(float*g_A,float*g_B,float*g_C,intN)
{
unsignedinti=threadIdx.x;
if(i<N)
{g_C[i]=g_A[i]+g_B[i];}
}
voidVecAdd(float*h_A,float*h_B,float*h_C,intN)
{
if(!InitCUDA())
{return;}
float*g_A,*g_B,*g_C;
unsignedintsize=N*sizeof(float);
CUDA_SAFE_CALL(cudaMalloc((void**)&g_A,size));
CUDA_SAFE_CALL(cudaMalloc((void**)&g_B,size));
CUDA_SAFE_CALL(cudaMalloc((void**)&g_C,size));
CUDA_SAFE_CALL(cudaMemcpy(g_A,h_A,size,cudaMemcpyHostToDevice));
CUDA_SAFE_CALL(cudaMemcpy(g_B,h_B,size,cudaMemcpyHostToDevice));
D_VecAdd<<<1,N>>>(g_A,g_B,g_C,N);
CUDA_SAFE_CALL(cudaMemcpy(h_C,g_C,size,cudaMemcpyDeviceToHost));
cudaFree(g_A);cudaFree(g_B);cudaFree(g_C);
}
第五步,如果您已经正确完成了以上四步,那么剩下的就只有编译,只要您用过VS,这一步就不需要我介绍了吧。成功之后,在您的解决方案文件目录下的Debug文件夹下会有一个VecAdd_dynamic.dll文件。
3、在.NET中使用CUDAC编写的DLL
下面介绍在托管程序中如何使用VecAdd_dynamic.dll。
第一步,在上面的解决方案CUDADemo下添加一个C++/CLR的Windows窗体应用程序,工程名为NETDemo(当然您也可以重新建一个解决方案,工程名也是随意的)。
第二步,在窗体上添加一个按钮,名字随意,我将它的现实文本改为“调用CUDA_DLL”,给这个按钮添加click事件。我们的代码将在这个事件里添加调用VecAdd()的程序。在窗体上添加一个文本框用来显示调用输出的结果。
第三步,代码实现。为工程NETDemo添加一个头文件,我将它命名为Win32.h,这个文件中主要是实现VecAdd()函数的导入。在此文件中添加如下代码
#pragmaonce
namespaceWin32
{
usingnamespaceSystem::Runtime::InteropServices;
[DllImport("VecAdd_dynamic.dll",EntryPoint="VecAdd",CharSet=CharSet::Auto)]
extern"C"voidVecAdd(float*h_A,float*h_B,float*h_C,intN);
}
在Form1.h中,#pragmaonce之后namespaceNETDemo之前添加以下代码。
#include"Win32.h"
#include
在button1_Click()中添加如下代码
intN=8;
float*h_A=(float*)malloc(N*sizeof(float));
float*h_B=(float*)malloc(N*sizeof(float));
float*h_C=(float*)malloc(N*sizeof(float));
for(inti=0;i<N;i++)
{h_A[i]=i;h_B[i]=i;}
Win32::VecAdd(h_A,h_B,h_C,N);
String^reslut;
for(inti=0;i<N;i++)
{reslut+=Convert::ToString(h_C[i])+",";}
this->textBox1->Text=Convert::ToString(reslut);
free(h_A);free(h_B);free(h_C);
第四步、执行NETDemo项目。点击“调用CUDA_DLL”,您会看到图3所示的结果
图3NETDemo运行结果
到现在为止您已经完全可以正确使用CUDA了。
⑧ 我目前能编一些比较基础的C语言程序,那个cuda是不是和C有比较大的关系,我有一些C甚至C++的基
你好,
CUDA不难学,但是学好非常难。CUDA的主要功能是用GPU来做型辩运并行计算,它需要你不但有很好培悔C和C++的基础,还需要你有一定的线性代数知识。如果想参加认证考试,你起码要掌握以下几个方面:
1,GPU硬件架构
2,CUDA programming model
3,线性代数
4,典型的并行计算pattern: 如并行归约算法,并行前缀加法,并行矩阵处理等等。
5,对于代码本身而言,你需要熟练掌握指针和动态空间分配。
6,掌握各种数据类型的大小。
参考:Program massively paralell multiprocessors,这本书有电子版,全都配租正看完并且掌握的话你就可以考试了。
谢谢,望采纳。
⑨ cuda编程,把CPU转到CUDA的编程,这算法有点不正确!求解
cuda是基于标准c语言的,你先把c语言的基础学好,然后动手自己写一顷知些c语言的程序,等对c语言有一定的功底之后,再看cuda,cuda与c语言的不同之处我觉得州塌在于那册乎圆个内核函数,以及如何划分线程块和栅格的纬度和大小,以及如何实现对于线程的索引的搜索,让每一个线程处理对应的一个变量或者几个变量。
然后是cuda的一些基础的语法,这些你可以看一些简单的cuda的例子,例如矩阵相加的例子,通过这些程序的例子可以很好的理解这些语法。
⑩ 《Android编程权威指南》这本书翻译的怎么样
原书名:Androidprogramming:thebignerdranchguide原出版社:BigNerdRanchGuides作者:(美)BillPhillipsBrianHardy译者:王明发丛书名:图灵程序设计丛书出版社:人民邮电出版社ISBN:9787115346438上架时间:2014-3-18出版日期:2014年4月开本:16开页码:523版次:1-1所属分类:计算机>软件与程序设计>移动开发>Android编辑推荐Amazon榜首畅销书全面覆盖Android开发知识点全真示例、循循善诱、轻松上手内容简介书籍计算机书籍BigNerdRanch是美国一家专业的移动开发技术培训机构,《Android编程权威指南》主要以训练营的5天教学课程为基础,融合了两位作者多年的心得体会,是一本完全面向实战的Android编程权威指南。全书共37章,详细介绍了GeoQuiz、HelloMoon、DragAndDraw等8个Android应用。这些应用的难易程度不一,最复杂的CriminalIntent应用占用了13章的篇幅。通过这些精心设计的应用,读者可掌握很多重要的理论知识和开发技巧,获得最前沿的开发经验。如果你熟悉Java语言,或者了解对面向对象编程,那就立刻开始Android编程之旅吧!作译者BillPhillipsBigNerdRanch资深Android讲师、高级软件工程师。他与BrianHardy合作,为BigNerdRanch开发了广受好评的5天Android训练营培训课程。Bill擅长透彻地理解事物的本质,并帮助其他人做到这一点。闲暇时间,Bill喜欢阅读和弹钢琴。BrianHardyBigNerdRanch首席软件工程师、资深讲师。BigNerdRanch的Android、iOS和Ruby培训课程均由Brian设计开发。闲暇时间,Brian喜欢骑自行车和听音乐。目录《Android编程权威指南》第1章Android应用初体验11.1应用基础21.2创建Android项目21.3Eclipse工作区导航51.4用户界面设计61.4.1视图层级结构91.4.2组件属性101.4.3创建字符串资源111.4.4预览界面布局121.5从布局XML到视图对象131.6组件的实际应用151.6.1类包组织导入161.6.2引用组件161.6.3设置监听器171.7使用模拟器运行应用211.8Android编译过程22第2章Android与MVC设计模式262.1创建新类262.2Android与MVC设计模式30↓全部内容译者序2007年,苹果公司发布了革命性的iPhone,自此开启了智能手机的新时代。随后,2008年,谷歌公司和开放手机联盟共同开发并推出了Android智能手机。时至今日,移动智能设备不仅深刻影响了智能手机行业,也改变了整个科技产业以及人们生活的方方面面,在全球掀起巨大的移动浪潮。迎着这股浪潮,国际巨头、创业公司、独立开发者各展身手,奋力搏击,抢登浪潮之巅。苹果一度成了全球市值最高的公司,三星则是卖出了数亿部Android手机。2013年,网络以19亿美元的价格收购了91无线。2014年开春,Facebook更是以190亿美元的天价收购了开发WhatsApp应用仅有50名员工的公司,直接把这股移动浪潮推到了巅峰。豪不夸张地说,所有这一切都离不开移动软件的开发。目前主流的开发平台是苹果的iOS系统和谷歌的Android系统。凭借精美绝伦的UI、流畅顺滑的交互体验,iOS开发在早期抢占了先机。但如今,谷歌在Android系统UI设计及优化方面的前进步伐已赶超苹果在创新方面的进步。越来越多的软件人开始投身Android应用开发阵营。对于业余爱好者来说,Android还是iOS,喜欢谁就选谁。而对于专业开发人员,果粉也好,Android迷也罢,从职业发展及商业利益角度来说,掌握双平台开发是必须的。作为荣获2012Jolt生产力大奖的iOS编程教程的姊妹篇,BigNerdRanch公司再接再厉,推出了这本《Android编程权威指南》。英文版甫一上架立即赢得了Amazon读者的广泛赞誉。本书基于BigNerdRanch公司的Bootcamp教程编写而成。BigNerdRanch创于2001年,是美国一家知名IT培训公司,每年为微软、谷歌、Faceboook等行业巨头培养众多专业人才。而BootCamp在英文中原意为美国海军陆战队新兵训练营,应用于IT培训行业中,意指通过全真IT项目实战,培训出像美国海军陆战队员那样优秀的IT人才。本书适合有一定Java编程经验(至少熟悉Java)并对Android开发感兴趣的读者阅读。本书最大的特点是,从Android应用的基本概念及组成开始介绍直至完成一个复杂实用的谷歌地图应用,作者巧妙地把Android开发所需的庞杂知识、行业实践、编程规范等融入本书,并以一种润物无声的导学方式引领读者轻松完成全书的开发学习。第26章在讲解后台任务和线程时,作者寓教于乐,还精心安排了在鞋店工作的闪电侠案例,既能帮助读者形象地理解复杂抽象概念,又让人印象深刻,难以忘却。类似这样的案例、幽默全书俯拾皆是,还是等读者自己去发掘吧。另外,几乎每章都配有深入学习及难度逐步升级的挑战练习版块。深入学习意在让读者进一步掌握本章关键知识点并指明学习更高级主题的方向;挑战练习能够让读者立即获得练手的机会,通过练习巩固运用所学知识。学完本书,在实际开发中,读者自然而然就会知道该做什么,如何去做以及为什么这样做。最后,感谢图灵各位编辑老师的辛勤工作,尤其感谢李静老师的细心指导,本书及本人都获益良多。更要感谢的是我的clover和千寻,没有他们的宽容、理解与支持,本书译稿不可能完成。虽然我已尽力传达原作本意并保证译稿的较高质量,但有时拼写错误、因版本升级而导致某些内容不再适用,甚至是囿于个人水平而犯错的情况再所难免。如果你发现了问题或有好的建议,请批评指正并不吝电邮提交至[email protected]或反馈至图灵社区。2014年2月28日于上海