▶ 分离编译【留坑,在 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. mvc一对多模型表单的快速构建

    功能需求描述 Q:在实际的开发中,经常会遇到一个模型中包含有多个条目的表单.如何将数据提交到后台? A: 以数组的形式提交到后台就Ok了(真的那么简单么,如果再嵌套一层呢?) A2:拆分多个模型,映射 ...

  2. AngularJS–Scope(作用域)

    点击查看AngularJS系列目录 转载请注明出处:http://www.cnblogs.com/leosx/ Scope Scope 是一个应用程序的模块的对象.它是表达式的执行上下文.它充斥在DO ...

  3. InnoDB Undo Log

    简介 Undo Log包含了一系列在一个单独的事务中会产生的所有Undo Log记录.每一个Undo Log记录包含了如何undo事务对某一行修改的必要信息.InnoDB使用Undo Log来进行事务 ...

  4. ssh (免密码登录、开启服务)

    ssh 无密码登录要使用公钥与私钥.linux下可以用用ssh-keygen生成公钥/私钥对,下面我以Unbutun为例.有机器A(192.168.1.155),B(192.168.1.181).现想 ...

  5. 醒醒吧!互联网的真正未来不是AI,更不是VR,AR,而是区块链

    这些力量并非命运,而是轨迹.他们提供的并不是我们将去向何方的预测,而是告诉我们,在不远的将来,我们会向那个方向前行,必然而然. ---凯文•凯利 文字与货币 人类在演化过程中,凭借智慧创造了无数事物, ...

  6. ch2-vue实例(new Vue({}) 属性与方法 声明周期)

    Vue 实例1 每个Vue.js都是通过创建一个Vue的根实例启动的 var vm = new Vue({}) 2 扩展Vue构造器,用预定义选项创建可复用的组件构造器 var MyComponent ...

  7. Win CE 6.0 获取手持机GPS定位1----基础知识 (C#)

    一.GPS全球定位系统的组成 (1)GPS卫星(空间部分) 由沿接近环形的地球轨道运行的24颗卫星组成,位于距地表20200千米的高空,均匀分布在6个轨道面上(每个轨道面4颗),轨道倾角55度.此外, ...

  8. c#中常量、ReadOnly和Static ReadOnly的差异

    不定时更新翻译系列,此系列更新毫无时间规律,文笔菜翻译菜求各位看官老爷们轻喷,如觉得我翻译有问题请挪步原博客地址 本博文翻译自: http://www.arungudelli.com/tutorial ...

  9. Java集合源码分析(一)ArrayList

    前言 在前面的学习集合中只是介绍了集合的相关用法,我们想要更深入的去了解集合那就要通过我们去分析它的源码来了解它.希望对集合有一个更进一步的理解! 既然是看源码那我们要怎么看一个类的源码呢?这里我推荐 ...

  10. Linux-Nand Flash驱动(分析MTD层并制作NAND驱动)

    1.本节使用的nand flash型号为K9F2G08U0M,它的命令如下: 1.1我们以上图的read id(读ID)为例,它的时序图如下: 首先需要使能CE片选 1)使能CLE 2)发送0X90命 ...