▶ 本书中用到的公用函数放到了头文件book.h中

 #ifndef __BOOK_H__
#define __BOOK_H__
#include <stdio.h>
#include <stdlib.h> // 自己加的
#include "cuda_runtime.h" // 自己加的 static void HandleError( cudaError_t err, const char *file, int line )//定义报错函数,通过传入的返回值和文件名、行号来提示信息
{
if (err != cudaSuccess)
{
printf( "%s in %s at line %d\n", cudaGetErrorString( err ),file, line );
exit( EXIT_FAILURE );
}
}
#define HANDLE_ERROR( err ) (HandleError( err, __FILE__, __LINE__ ))// 将报错函数包装为宏,自动填塞文件名和行号 #define HANDLE_NULL( a )/* 空指针报错函数,代码中malloc失败时报错 */ \
{ \
if (a == NULL) \
{ \
printf( "Host memory failed in %s at line %d\n", __FILE__, __LINE__ );\
exit(EXIT_FAILURE); \
} \
} template< typename T >// 泛型交换(全书都没用到?)
void swap( T& a, T& b )
{
T t = a;
a = b;
b = t;
} void* big_random_block( int size )//在主机中生成随机数组,无符号字符型
{
unsigned char *data = (unsigned char*)malloc( size );
HANDLE_NULL( data );
for (int i = ; i < size; data[i] = rand(), i++);
return data;
} int* big_random_block_int( int size )//在主机中生成随机数组,整型
{
int *data = (int*)malloc( size * sizeof(int) );
HANDLE_NULL( data );
for (int i = ; i < size; data[i] = rand(), i++);
return data;
} // 公用设备函数
__device__ unsigned char value(float n1, float n2, int hue)
{
if (hue > )
hue -= ;
else if (hue < )
hue += ;
if (hue < )
return (unsigned char)( * (n1 + (n2 - n1)*hue / ));
if (hue < )
return (unsigned char)( * n2);
if (hue < )
return (unsigned char)( * (n1 + (n2 - n1)*( - hue) / ));
return (unsigned char)( * n1);
} __global__ void float_to_color(unsigned char *optr, const float *outSrc)
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x; float l = outSrc[offset];
float s = ;
int h = ( + (int)(360.0f * outSrc[offset])) % ;
float m1, m2; if (l <= 0.5f)
m2 = l * ( + s);
else
m2 = l + s - l * s;
m1 = * l - m2; optr[offset * + ] = value(m1, m2, h + );
optr[offset * + ] = value(m1, m2, h);
optr[offset * + ] = value(m1, m2, h - );
optr[offset * + ] = ;
} __global__ void float_to_color( uchar4 *optr,const float *outSrc )
{
int x = threadIdx.x + blockIdx.x * blockDim.x;
int y = threadIdx.y + blockIdx.y * blockDim.y;
int offset = x + y * blockDim.x * gridDim.x; float l = outSrc[offset];
float s = ;
int h = ( + (int)(360.0f * outSrc[offset])) % ;
float m1, m2; if (l <= 0.5f)
m2 = l * ( + s);
else
m2 = l + s - l * s;
m1 = * l - m2; optr[offset].x = value(m1, m2, h + );
optr[offset].y = value(m1, m2, h);
optr[offset].z = value(m1, m2, h - );
optr[offset].w = ;
} // 有关线程的设置
#if _WIN32
//Windows threads.
#include <windows.h> typedef HANDLE CUTThread;// 统一包装
typedef unsigned (WINAPI *CUT_THREADROUTINE)(void *); #define CUT_THREADPROC unsigned WINAPI
#define CUT_THREADEND return 0 #else
//POSIX threads.
#include <pthread.h> typedef pthread_t CUTThread;
typedef void *(*CUT_THREADROUTINE)(void *); #define CUT_THREADPROC void
#define CUT_THREADEND
#endif // 线程的创造,单线程结束,单线程销毁和多线程等待
CUTThread start_thread( CUT_THREADROUTINE, void *data );
void end_thread( CUTThread thread );
void destroy_thread( CUTThread thread );
void wait_for_threads( const CUTThread *threads, int num ); #if _WIN32
CUTThread start_thread(CUT_THREADROUTINE func, void *data)
{
return CreateThread(NULL, , (LPTHREAD_START_ROUTINE)func, data, , NULL);
} void end_thread(CUTThread thread)
{
WaitForSingleObject(thread, INFINITE);
CloseHandle(thread);
} void destroy_thread( CUTThread thread )
{
TerminateThread(thread, );
CloseHandle(thread);
} void wait_for_threads(const CUTThread * threads, int num){
WaitForMultipleObjects(num, threads, true, INFINITE); for(int i = ; i < num; i++)
CloseHandle(threads[i]);
} #else
CUTThread start_thread(CUT_THREADROUTINE func, void * data)
{
pthread_t thread;
pthread_create(&thread, NULL, func, data);
return thread;
} void end_thread(CUTThread thread)
{
pthread_join(thread, NULL);
} void destroy_thread( CUTThread thread )
{
pthread_cancel(thread);
} void wait_for_threads(const CUTThread * threads, int num)
{
for(int i = ; i < num; i++)
end_thread( threads[i] );
}
#endif #endif // __BOOK_H__

《GPU高性能编程CUDA实战》附录三 关于book.h的更多相关文章

  1. [问题解决]《GPU高性能编程CUDA实战》中第4章Julia实例“显示器驱动已停止响应,并且已恢复”问题的解决方法

    以下问题的出现及解决都基于"WIN7+CUDA7.5". 问题描述:当我编译运行<GPU高性能编程CUDA实战>中第4章所给Julia实例代码时,出现了显示器闪动的现象 ...

  2. 《GPU高性能编程CUDA实战》附录二 散列表

    ▶ 使用CPU和GPU分别实现散列表 ● CPU方法 #include <stdio.h> #include <time.h> #include "cuda_runt ...

  3. 《GPU高性能编程CUDA实战》第三章 CUDA设备相关

    ▶ 这章介绍了与CUDA设备相关的参数,并给出了了若干用于查询参数的函数. ● 代码(已合并) #include <stdio.h> #include "cuda_runtime ...

  4. 《GPU高性能编程CUDA实战》附录四 其他头文件

    ▶ cpu_bitmap.h #ifndef __CPU_BITMAP_H__ #define __CPU_BITMAP_H__ #include "gl_helper.h" st ...

  5. 《GPU高性能编程CUDA实战》附录一 高级原子操作

    ▶ 本章介绍了手动实现原子操作.重构了第五章向量点积的过程.核心是通过定义结构Lock及其运算,实现锁定,读写,解锁的过程. ● 章节代码 #include <stdio.h> #incl ...

  6. 《GPU高性能编程CUDA实战》第五章 线程并行

    ▶ 本章介绍了线程并行,并给出四个例子.长向量加法.波纹效果.点积和显示位图. ● 长向量加法(线程块并行 + 线程并行) #include <stdio.h> #include &quo ...

  7. 《GPU高性能编程CUDA实战》第十一章 多GPU系统的CUDA C

    ▶ 本章介绍了多设备胸膛下的 CUDA 编程,以及一些特殊存储类型对计算速度的影响 ● 显存和零拷贝内存的拷贝与计算对比 #include <stdio.h> #include " ...

  8. 《GPU高性能编程CUDA实战》第四章 简单的线程块并行

    ▶ 本章介绍了线程块并行,并给出两个例子:长向量加法和绘制julia集. ● 长向量加法,中规中矩的GPU加法,包含申请内存和显存,赋值,显存传入,计算,显存传出,处理结果,清理内存和显存.用到了 t ...

  9. 《GPU高性能编程CUDA实战》第八章 图形互操作性

    ▶ OpenGL与DirectX,等待填坑. ● basic_interop #include <stdio.h> #include "cuda_runtime.h" ...

随机推荐

  1. 51Nod 1072:威佐夫游戏 (威佐夫博奕)

    1072 威佐夫游戏  基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 有2堆石子.A B两个人轮流拿,A先拿.每次可以从一堆中取任意个或从2堆中取相同数 ...

  2. Windows下同一台机器上elasticsearch集群的配置以及elasticsearch-head插件的使用

    ElasticSearch是一个基于Lucene的开源搜索服务器,现已经被越来越多的企业运用于项目当中,笔者为了学习es在自己机器上简单的搭建了一个es集群,此文权当记录. 1.我用到的压缩包 下载地 ...

  3. ZH奶酪:最简单的Django安装方法(Windows 7)

    前提是你已经在机器上安装了python~并且你的机器能够上网~ 1.进入:https://bootstrap.pypa.io/get-pip.py,ctrl+s保存网页(其实是.py文件)到某一目录: ...

  4. hasura-graphql 集成 pipelinedb 1.0.0

    pipelinedb 1.0.0 已经是一个标准的pg 扩展了,同时以前的语法也有变动,但是集成进hasura-graphql 更方便了 使用docker-compose 运行 环境准备 docker ...

  5. 使用rewrite 让php 实现类似asp.net 的IHttpModule 进行带参数js文件的参数获取

    asp.net 的IHttpModule 接口具有很大的作用,我们可以使用实现的模块进行全局的控制,但是在学习php 的过程中也想实现类似的功能,查找php 的文档,自己没有找到, 但是我们大家应该知 ...

  6. VPC/VM/VBOX安装GHOST版的无法启动系统

    本人最近在安装一些公司的虚拟机,方便开发使用,不用每次都安装几个小时的装机和安装软件,但是本次却遇到了一点问题,虚拟机安装完成后一直无法进入系统,只有一个光标在黑色的屏幕上一闪一闪的,也没有任何错误提 ...

  7. juc包下的集合类

    import java.util.Iterator;import java.util.concurrent.CopyOnWriteArrayList; /** * 集合在多线程中同步的方式: * 1. ...

  8. linux ping报错Name or service not known

    ubuntu设置静态ip以后忘记设置dns,ping的时候报错:Name or service not known 添加dns即可 vi /etc/resolv.conf nameserver 8.8 ...

  9. C#实现不安装Oracle客户端访问远程服务器数据

    概述: C#通过使用ADO的方式在未安装Oracle数据库的前提下,客户端程序远程访问服务器,会出现:“System.Data.OracleClient 需要 Oracle 客户端软件 8.1.7 或 ...

  10. Druid 连接池 JDBCUtils 工具类的使用

    Druid工具介绍 它不仅仅是一个数据库连接池,它还包含一个ProxyDriver,一系列内置的JDBC组件库,一个SQL Parser. 支持所有JDBC兼容的数据库,包括Oracle.MySQL. ...