▶ 分离编译【留坑,在 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. escape()、encodeURI()、encodeURIComponent()区别详解(转)

      JavaScript中有三个可以对字符串编码的函数,分别是: escape,encodeURI,encodeURIComponent,相应3个解码函数:unescape,decodeURI,dec ...

  2. 第1回-使用ThinkPHP的3.1.3版本轻松建网站

    使用ThinkPHP的3.1.3版本轻松建网站 首先,从ThinkPHP官网下载一个ThinkPHP3.1.3版本框架包. 其次,取出ThinkPHP3.1.3包中的核心部分,部署你的服务器项目下. ...

  3. 【Kafka】操作命令

    生产者 ./kafka-console-producer.sh --broker-list --topic norm 消费者 ./kafka-console-consumer.sh --zookeep ...

  4. hdu 1542 线段树 求矩形并

    Atlantis Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Su ...

  5. 5分钟教你玩转 sklearn 机器学习(上)

    假期结束,你的状态有没有回归?那么,放空脑袋后,先来学习学习,欢迎大家继续关注腾讯云技术社区. 作者:赵成龙 这是一篇很难写的文章,因为我希望这篇文章能对大家有所帮助.我不会给大家介绍机器学习,数据挖 ...

  6. MySQL Windows版安装详解

    一.下载MySQL MySQL官网https://dev.mysql.com提供了Windows下的安装版msi和解压版zip,其中均包含32和64位版本,mis版本与SqlServer安装基本一致N ...

  7. 学习如何看懂SQL Server执行计划——基本知识篇

    一.基本概念 1.数据的读取 页(page)是SQL SERVER可以读写的最小I/O单位.即使只需访问一行,也要把整个页加载到缓存之中,再从缓存中读取数据.物理读取是从磁盘上读取,逻辑读取是从缓存中 ...

  8. Codeforces Round #441 (Div. 2, by Moscow Team Olympiad) D. Sorting the Coins

    http://codeforces.com/contest/876/problem/D 题意: 最开始有一串全部由"O"组成的字符串,现在给出n个数字,指的是每次把位置n上的&qu ...

  9. 【Spring】浅谈spring推荐构造器注入

    一.前言 ​ Spring框架对Java开发的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反转)和AOP,平时使用最多的就是其中的IOC,我们通过将组件交由S ...

  10. Hadoop(八)Java程序访问HDFS集群中数据块与查看文件系统

    前言 我们知道HDFS集群中,所有的文件都是存放在DN的数据块中的.那我们该怎么去查看数据块的相关属性的呢?这就是我今天分享的内容了 一.HDFS中数据块概述 1.1.HDFS集群中数据块存放位置 我 ...