▶ 本书中用到的公用函数放到了头文件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. 在有 UI 线程参与的同步锁(如 AutoResetEvent)内部使用 await 可能导致死锁

    AutoResetEvent.ManualResetEvent.Monitor.lock 等等这些用来做同步的类,如果在异步上下文(await)中使用,需要非常谨慎. 本文将说一个在同步上下文中非常常 ...

  2. 关于递归函数中的return位置

    1.对于求是否有解的问题一般使用bool dfs()  其中return 可以放在递归式后面 2.对于需要更新解的问题一般使用int dfs()  其中return 不能放在递归式后面,必须放在函数最 ...

  3. CH3602 Counting Swaps

    题意 3602 Counting Swaps 0x30「数学知识」例题 背景 https://ipsc.ksp.sk/2016/real/problems/c.html Just like yeste ...

  4. loopback v4 特性

    loopback 是一个api 服务框架,挺方便的,同时也已经演进了好几代了v4 有一些新功能的 支持 新特性 基于typescript/es2017 开发 openapi 驱动的rest api 开 ...

  5. c++标准库的所有类型

    标准库的组成:    前言就到此为止.从最宏观的层面上看,C++标准库由十个部分组成:语言支持.诊断.通用工具.字符串.本地化.容器.迭代器.通用算法.数值算法和I/O. 头文件组成:    C++ ...

  6. 函数对象(functional)

    来自STL中的概念:如果f是一个function object,则可以将operator()作用于f身上. 调用函数对象时构造函数和operator()执行顺序 首先执行构造函数,构造出一个匿名对象 ...

  7. BeanUtils Object 取值赋值

    /** * 将结果集导出为Excel * * @param response * @param fsc * @param columns * @param bizType * @throws Exce ...

  8. iis运行asp.net页面提示“服务器应用程序不可用”的解决办法_.NET.

    原因:主要是iis安装在了net framwork之后 解决办法:需要在IIS中重新注册.net 也就是要用到系统盘: cd c:\windows\microsoft.net\framework\v2 ...

  9. 白话 Java Bean

    所谓的Java Bean,就是一个java类,编译后成为了一个后缀名是 .class的文件.这就是Java Bean,不就是Java类吗? 1. 什么是 Java Bean? 很多培训机构在讲java ...

  10. <<APUE>> 编译方法

    /********************************************************************************第0种-最简单实用********** ...