附录三 关于book.h
▶ 本书中用到的公用函数放到了头文件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__
附录三 关于book.h的更多相关文章
- [问题解决]《GPU高性能编程CUDA实战》中第4章Julia实例“显示器驱动已停止响应,并且已恢复”问题的解决方法
以下问题的出现及解决都基于"WIN7+CUDA7.5". 问题描述:当我编译运行<GPU高性能编程CUDA实战>中第4章所给Julia实例代码时,出现了显示器闪动的现象 ...
- 《GPU高性能编程CUDA实战》附录二 散列表
▶ 使用CPU和GPU分别实现散列表 ● CPU方法 #include <stdio.h> #include <time.h> #include "cuda_runt ...
- 《GPU高性能编程CUDA实战》附录三 关于book.h
▶ 本书中用到的公用函数放到了头文件book.h中 #ifndef __BOOK_H__ #define __BOOK_H__ #include <stdio.h> #include &l ...
- 《GPU高性能编程CUDA实战》第三章 CUDA设备相关
▶ 这章介绍了与CUDA设备相关的参数,并给出了了若干用于查询参数的函数. ● 代码(已合并) #include <stdio.h> #include "cuda_runtime ...
- 《GPU高性能编程CUDA实战》附录四 其他头文件
▶ cpu_bitmap.h #ifndef __CPU_BITMAP_H__ #define __CPU_BITMAP_H__ #include "gl_helper.h" st ...
- 《GPU高性能编程CUDA实战》附录一 高级原子操作
▶ 本章介绍了手动实现原子操作.重构了第五章向量点积的过程.核心是通过定义结构Lock及其运算,实现锁定,读写,解锁的过程. ● 章节代码 #include <stdio.h> #incl ...
- 《GPU高性能编程CUDA实战》第五章 线程并行
▶ 本章介绍了线程并行,并给出四个例子.长向量加法.波纹效果.点积和显示位图. ● 长向量加法(线程块并行 + 线程并行) #include <stdio.h> #include &quo ...
- 《GPU高性能编程CUDA实战》第十一章 多GPU系统的CUDA C
▶ 本章介绍了多设备胸膛下的 CUDA 编程,以及一些特殊存储类型对计算速度的影响 ● 显存和零拷贝内存的拷贝与计算对比 #include <stdio.h> #include " ...
- 《GPU高性能编程CUDA实战》第四章 简单的线程块并行
▶ 本章介绍了线程块并行,并给出两个例子:长向量加法和绘制julia集. ● 长向量加法,中规中矩的GPU加法,包含申请内存和显存,赋值,显存传入,计算,显存传出,处理结果,清理内存和显存.用到了 t ...
- 《GPU高性能编程CUDA实战》第八章 图形互操作性
▶ OpenGL与DirectX,等待填坑. ● basic_interop #include <stdio.h> #include "cuda_runtime.h" ...
随机推荐
- Java 基础语法
一.关键字 定义:被 Java 赋予特殊含义的单词. 特点:基本上都是英文小写. 用于定义数据类型的关键字 基本数据类型 整数型(默认为 int) byte(8 位,1 字节,默认值是 0,最大存储数 ...
- Spark sql ---JSON
介绍Spark SQL的JSON支持,这是我们在Databricks中开发的一个功能,可以在Spark中更容易查询和创建JSON数据.随着网络和移动应用程序的普及,JSON已经成为Web服务API以及 ...
- 分享ES6中比较常用又强大的新特性
前言 es6有很多新东西,但是感觉常用的并不是很多,这里学习记录了一些我自己认为非常常用又强大的新特性. scoping 实用的块级作用域,let x = xxx 可以声明一个块级作用域的局部变量,简 ...
- hdu2157矩阵快速幂
How many ways?? Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) ...
- dubbo负载均衡策略及对应源码分析
在集群负载均衡时,Dubbo 提供了多种均衡策略,缺省为 random 随机调用.我们还可以扩展自己的负责均衡策略,前提是你已经从一个小白变成了大牛,嘻嘻 1.Random LoadBalance 1 ...
- Python实战之字符串的详细简单练习
['__add__', '__class__', '__contains__', '__delattr__', '__dir__', '__doc__', '__eq__', '__format__' ...
- IDL 创建数组
1.赋值创建 通过方括号[]赋值创建数组,示例代码如下 IDL> arr=[1,2,3] IDL> help,arr ARR INT = Array[3] IDL> arr=[[1, ...
- C#对图片进行马赛克处理,可控制模糊程度
using System.Drawing; using System.Drawing.Imaging; using System.Web.Mvc; namespace MVC2017_Sample.C ...
- Echarts数据可视化legend图例,开发全解+完美注释
全栈工程师开发手册 (作者:栾鹏) Echarts数据可视化开发代码注释全解 Echarts数据可视化开发参数配置全解 6大公共组件详解(点击进入): title详解. tooltip详解.toolb ...
- Swift搭建服务端
原文:Hello Server Side Swift 作者:Logan Wright 译者:CocoaChina--kmyhy(博客) 自从苹果官方发布了一个 Swift 的 Linux 开源版本之后 ...