▶ 分离编译【留坑,在 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. .NET Excel导出方法及其常见问题详解

    摘要:.NET Excel导出方法及其常见问题详解. 一.Excel导出的实现方法 在.net 程序开发中,对于Excel文件的导出我们一共有三种导出方式: 利用文件输出流进行读写操作 这种方式的导出 ...

  2. Invoke 用法

    转自:http://blog.sina.com.cn/s/blog_5a6f39cf0100s23x.html 在多线程编程中,我们经常要在工作线程中去更新界面显示,而在多线程中直接调用界面控件的方法 ...

  3. Javascript中的noscript

    引言: 在浏览器日常火爆的时代,个大浏览器几乎都想占主导地位,争个你死我活,所以现在的各大浏览器都支持javascript脚本语言,但是在童鞋们,我们假设一下,万一哪个用户出于安全,把浏览器的java ...

  4. 第5章 不要让线程成为脱缰的野马(Keeping your Threads on Leash) ---线程优先权(Thread priority)

    有没有过这样的经验?你坐在你的车子里,目的地还在好几公里之遥,而时间已经很晚了.你拼命想告诉那些挡住你去路的人们,今天这个约会对你是多么多么重要,能不能请他们统统--呃--滚到马路外?很不幸,道路系统 ...

  5. 替换应用程序DLL动态库的详细方法步骤 (gts.dll为例)

    在C++ builder编译器IDE软件下 1.View -Project Manageer --找到需要替换的x.dll(gts.dll)对应的x.lib(gts.lib),然后Remove2.Pr ...

  6. 【运维】CPU负载

    最近对我的本本(4核8线程)用top命令看系统状况出现了CPU利用率超过200%的情况,非常诧异,查了下相关资料,把这个问题弄清楚了.首先来分析下CPU Load load average: 0.09 ...

  7. css3换行的三方式的对比(整理)

    CSS3 文本换行 (转载..) 作者 张歆琳 关注 2016.06.20 10:49* 字数 1101 阅读 676评论 1喜欢 6 文本换行其实是个非常常用但并不起眼的特性.你什么都不用设,浏览器 ...

  8. Python中wx.FlexGridSizer

    FlexGridSizer是GridSizer的一个更灵活的版本.它与标准的GridSizer几乎相同,除了下面3点例外: 1.每行和每列可以有各自的尺寸.2.默认情况下,当尺寸调整时,它行和列整体改 ...

  9. java web Servlet学习笔记-2 请求重定向和请求转发的区别

    请求转发与请求重定向的区别 请求重定向和转发 1.请求重定向:浏览器的行为(通过响应对象HttpServletResponse来执行) 特点:可以重新定向访问其他Web应用下的资源 浏览器发出了2次请 ...

  10. 使用Entify Framework 6.x的事务操作

    public void TransactionsTest() { using (var context = new testContext()) { //使用EF事务 在vs2013中先升级Entit ...