▶ 分离编译【留坑,在 Linux 上用命令行试一下】

▶ 源代码:

 // cppIntegration_gold.cpp
#include <vector_types.h> extern "C" void computeGold(char *reference, char *idata, const unsigned int len);
extern "C" void computeGold2(int2 *reference, int2 *idata, const unsigned int len); void computeGold(char *reference, char *idata, const unsigned int len)
{
for (unsigned int i = ; i < len; ++i)
reference[i] = idata[i] - ;
} void computeGold2(int2 *reference, int2 *idata, const unsigned int len)
{
for (unsigned int i = ; i < len; ++i)
{
reference[i].x = idata[i].x - idata[i].y;
reference[i].y = idata[i].y;
}
}
 // cppIntegration.cu
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <assert.h>
#include <cuda_runtime.h>
#include <helper_cuda.h>
#include <helper_functions.h> #ifndef MAX
#define MAX(a,b) (a > b ? a : b)
#endif extern "C" void computeGold(char *reference, char *idata, const unsigned int len);
extern "C" void computeGold2(int2 *reference, int2 *idata, const unsigned int len); // GPU上的运算
__global__ void kernel(int *g_data)
{
const unsigned int tid = threadIdx.x;
int data = g_data[tid];
// data 每个字节的值减去 10,再拼接到一起
g_data[tid] = ((((data << ) >> ) - ) << ) | ((((data << ) >> ) - ) << ) | ((((data << ) >> ) - ) << ) | ((((data << ) >> ) - ) << ) ;
} __global__ void kernel2(int2 *g_data) // 使用 int2* 格式的输入
{
const unsigned int tid = threadIdx.x;
int2 data = g_data[tid];
g_data[tid].x = data.x - data.y; // data.x 中每个元素减去 data.y 中对应元素的偏移量
} // 测试不同的核函数处理的结果。输入两种格式的待处理数据,及其长度
extern "C" bool runTest(char *data, int2 *data_int2, unsigned int len)
{
assert((len % ) == ); // 要求数组长度为 4 的倍数
const unsigned int num_threads = len / , mem_size = sizeof(char) * len, mem_size_int2 = sizeof(int2) * len; char *d_data;
cudaMalloc((void **)&d_data, mem_size);
cudaMemcpy(d_data, data, mem_size, cudaMemcpyHostToDevice);
int2 *d_data_int2;
cudaMalloc((void **)&d_data_int2, mem_size_int2);
cudaMemcpy(d_data_int2, data_int2, mem_size_int2, cudaMemcpyHostToDevice); kernel << < dim3(, , ), dim3(num_threads, , ) >> > ((int *)d_data);
kernel2 << < dim3(, , ), dim3(len, , ) >> > (d_data_int2); getLastCudaError("Kernel execution failed"); // 检查和函数运行是否有错误,有错则输出这话 char *reference = (char *)malloc(mem_size); // 使用 CPU 计算
computeGold(reference, data, len);
printf("ref char*:%s\n", reference);
int2 *reference2 = (int2 *)malloc(mem_size_int2);
computeGold2(reference2, data_int2, len);
printf("ref int2 :");
for (int i = ; i < len;i++)
printf("%c", reference2[i].x);
printf("\n"); cudaMemcpy(data, d_data, mem_size, cudaMemcpyDeviceToHost);
cudaMemcpy(data_int2, d_data_int2, mem_size_int2, cudaMemcpyDeviceToHost);
cudaDeviceSynchronize();
printf("gpu char*:%s\n", (char *)data);
printf("gpu int2 :");
for (int i = ; i < len; i++)
printf("%c", data_int2[i].x);
printf("\n"); cudaFree(d_data);
cudaFree(d_data_int2);
free(reference);
free(reference2);
return ;
}
 // main.cpp
#include <iostream>
#include <cstdlib>
#include <cuda_runtime.h>
#include <vector_types.h>
#include <helper_cuda.h> extern "C" bool runTest(char *data, int2 *data_int2, unsigned int len); int main()
{
const int len = ;
int2 i2[]; // cuda 内置的 int2 类型
char str[len] = { , , , ,, , , , , , , , , , , };
for (int i = ; i < len; i++)
{
i2[i].x = str[i];
i2[i].y = ;
}
runTest(str, i2, len); getchar();
return ;
}

● 输出结果:

ref char*: Hello World.
ref int2 :Hello World.
gpu char*: Hello World.
gpu int2 :Hello World.

▶ 涨姿势:

● cuda 内置的 int2 类型,整数有序对。涉及的定义如下:

 #define __cuda_builtin_vector_align8(tag, members)  \
struct __device_builtin__ __align__() tag \
{ \
members \
} __cuda_builtin_vector_align8(int2, int x; int y;); typedef __device_builtin__ struct int2 int2;

● 警告函数和错误检查函数

 #define assert(expression) (void)                                                                   \
( \
(!!(expression)) || (_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), )\
) #define getLastCudaError(msg) __getLastCudaError (msg, __FILE__, __LINE__) inline void __getLastCudaError(const char *errorMessage, const char *file, const int line)
{
cudaError_t err = cudaGetLastError();
if (cudaSuccess != err)
{
fprintf(stderr, "%s(%i) : getLastCudaError() CUDA error : %s : (%d) %s.\n",
file, line, errorMessage, (int)err, cudaGetErrorString(err));
DEVICE_RESET
exit(EXIT_FAILURE);
}
}

0_Simple__cppIntegration的更多相关文章

随机推荐

  1. websocket的理解及实例应用

    websocket协议是HTML5提出的一个新的规范,主要用于实现服务器及时推送信息给客户端的功能. websocket实现是基于HTTP协议的部分握手功能,但是websocket仅仅握手一次即可进行 ...

  2. Python NLP入门教程

    本文简要介绍Python自然语言处理(NLP),使用Python的NLTK库.NLTK是Python的自然语言处理工具包,在NLP领域中,最常使用的一个Python库. 什么是NLP? 简单来说,自然 ...

  3. oracle数据库备份、还原 (如何将Oracle 11g备份的dat文件导入到10g数据库里面)

    如何将Oracle 11g备份的dat文件导入到10g数据库里面 解决方法:      导出的时候后面加上目标数据库的版本号   导出: 在SQL plus下执行:create or replace  ...

  4. Spring Boot Document Part II(下)

    Part II. Getting started 11. 开发第一个Spirng Boot Application使用Spring Boot的关键特征开发一个基于JAVA Web的“Hello Wor ...

  5. PHP通过访客来路获取搜索关键词的方法

    <?php class keyword{ public function getKeyword($referer){ if(strpos($referer,"http://www.ba ...

  6. webpack2使用ch9-处理模板文件 .html .ejs .tpl模板使用

    1 目录展示 安装依赖 "ejs-loader": "^0.3.0","html-loader": "^0.4.5", ...

  7. ZOJ2067 经典 DP

    题目:一个由'.'和'#'组成矩形,统计里面'.'组成的矩形的个数.点击打开链接 自己写挂了,懒得搞了 #include <stdio.h> #include <string.h&g ...

  8. 项目收集-AutoMapper使用,事务,Json.Net序列化反序列化,代码生成调用等

    using System; using AutoMapper; using Newtonsoft.Json; using Newtonsoft.Json.Linq; namespace Console ...

  9. Eclipse自动补全增强

    在Eclipse中,从Window -> preferences -> Java -> Editor -> Content assist -> Auto-Activati ...

  10. 通过VBA,当在EXCEL单元格中输入任意的日期格式时,都能自动转换为指定的标准格式的日期值

    在日常录入EXCEL表格的单元格里 ,我们输入一些一般性的日期内容,如:2017-10-17 或 2017/10/17时,EXCEL会自动识别为日期并按单元格设计格式显示,单元格中存储的值也是日期格式 ...