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

▶ 源代码:

  1. // cppIntegration_gold.cpp
  2. #include <vector_types.h>
  3.  
  4. extern "C" void computeGold(char *reference, char *idata, const unsigned int len);
  5. extern "C" void computeGold2(int2 *reference, int2 *idata, const unsigned int len);
  6.  
  7. void computeGold(char *reference, char *idata, const unsigned int len)
  8. {
  9. for (unsigned int i = ; i < len; ++i)
  10. reference[i] = idata[i] - ;
  11. }
  12.  
  13. void computeGold2(int2 *reference, int2 *idata, const unsigned int len)
  14. {
  15. for (unsigned int i = ; i < len; ++i)
  16. {
  17. reference[i].x = idata[i].x - idata[i].y;
  18. reference[i].y = idata[i].y;
  19. }
  20. }
  1. // cppIntegration.cu
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <string.h>
  5. #include <math.h>
  6. #include <assert.h>
  7. #include <cuda_runtime.h>
  8. #include <helper_cuda.h>
  9. #include <helper_functions.h>
  10.  
  11. #ifndef MAX
  12. #define MAX(a,b) (a > b ? a : b)
  13. #endif
  14.  
  15. extern "C" void computeGold(char *reference, char *idata, const unsigned int len);
  16. extern "C" void computeGold2(int2 *reference, int2 *idata, const unsigned int len);
  17.  
  18. // GPU上的运算
  19. __global__ void kernel(int *g_data)
  20. {
  21. const unsigned int tid = threadIdx.x;
  22. int data = g_data[tid];
  23. // data 每个字节的值减去 10,再拼接到一起
  24. g_data[tid] = ((((data << ) >> ) - ) << ) | ((((data << ) >> ) - ) << ) | ((((data << ) >> ) - ) << ) | ((((data << ) >> ) - ) << ) ;
  25. }
  26.  
  27. __global__ void kernel2(int2 *g_data) // 使用 int2* 格式的输入
  28. {
  29. const unsigned int tid = threadIdx.x;
  30. int2 data = g_data[tid];
  31. g_data[tid].x = data.x - data.y; // data.x 中每个元素减去 data.y 中对应元素的偏移量
  32. }
  33.  
  34. // 测试不同的核函数处理的结果。输入两种格式的待处理数据,及其长度
  35. extern "C" bool runTest(char *data, int2 *data_int2, unsigned int len)
  36. {
  37. assert((len % ) == ); // 要求数组长度为 4 的倍数
  38. const unsigned int num_threads = len / , mem_size = sizeof(char) * len, mem_size_int2 = sizeof(int2) * len;
  39.  
  40. char *d_data;
  41. cudaMalloc((void **)&d_data, mem_size);
  42. cudaMemcpy(d_data, data, mem_size, cudaMemcpyHostToDevice);
  43. int2 *d_data_int2;
  44. cudaMalloc((void **)&d_data_int2, mem_size_int2);
  45. cudaMemcpy(d_data_int2, data_int2, mem_size_int2, cudaMemcpyHostToDevice);
  46.  
  47. kernel << < dim3(, , ), dim3(num_threads, , ) >> > ((int *)d_data);
  48. kernel2 << < dim3(, , ), dim3(len, , ) >> > (d_data_int2);
  49.  
  50. getLastCudaError("Kernel execution failed"); // 检查和函数运行是否有错误,有错则输出这话
  51.  
  52. char *reference = (char *)malloc(mem_size); // 使用 CPU 计算
  53. computeGold(reference, data, len);
  54. printf("ref char*:%s\n", reference);
  55. int2 *reference2 = (int2 *)malloc(mem_size_int2);
  56. computeGold2(reference2, data_int2, len);
  57. printf("ref int2 :");
  58. for (int i = ; i < len;i++)
  59. printf("%c", reference2[i].x);
  60. printf("\n");
  61.  
  62. cudaMemcpy(data, d_data, mem_size, cudaMemcpyDeviceToHost);
  63. cudaMemcpy(data_int2, d_data_int2, mem_size_int2, cudaMemcpyDeviceToHost);
  64. cudaDeviceSynchronize();
  65. printf("gpu char*:%s\n", (char *)data);
  66. printf("gpu int2 :");
  67. for (int i = ; i < len; i++)
  68. printf("%c", data_int2[i].x);
  69. printf("\n");
  70.  
  71. cudaFree(d_data);
  72. cudaFree(d_data_int2);
  73. free(reference);
  74. free(reference2);
  75. return ;
  76. }
  1. // main.cpp
  2. #include <iostream>
  3. #include <cstdlib>
  4. #include <cuda_runtime.h>
  5. #include <vector_types.h>
  6. #include <helper_cuda.h>
  7.  
  8. extern "C" bool runTest(char *data, int2 *data_int2, unsigned int len);
  9.  
  10. int main()
  11. {
  12. const int len = ;
  13. int2 i2[]; // cuda 内置的 int2 类型
  14. char str[len] = { , , , ,, , , , , , , , , , , };
  15. for (int i = ; i < len; i++)
  16. {
  17. i2[i].x = str[i];
  18. i2[i].y = ;
  19. }
  20. runTest(str, i2, len);
  21.  
  22. getchar();
  23. return ;
  24. }

● 输出结果:

  1. ref char*: Hello World.
  2. ref int2 :Hello World.
  3. gpu char*: Hello World.
  4. gpu int2 :Hello World.

▶ 涨姿势:

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

  1. #define __cuda_builtin_vector_align8(tag, members) \
  2. struct __device_builtin__ __align__() tag \
  3. { \
  4. members \
  5. }
  6.  
  7. __cuda_builtin_vector_align8(int2, int x; int y;);
  8.  
  9. typedef __device_builtin__ struct int2 int2;

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

  1. #define assert(expression) (void) \
  2. ( \
  3. (!!(expression)) || (_wassert(_CRT_WIDE(#expression), _CRT_WIDE(__FILE__), (unsigned)(__LINE__)), )\
  4. )
  5.  
  6. #define getLastCudaError(msg) __getLastCudaError (msg, __FILE__, __LINE__)
  7.  
  8. inline void __getLastCudaError(const char *errorMessage, const char *file, const int line)
  9. {
  10. cudaError_t err = cudaGetLastError();
  11. if (cudaSuccess != err)
  12. {
  13. fprintf(stderr, "%s(%i) : getLastCudaError() CUDA error : %s : (%d) %s.\n",
  14. file, line, errorMessage, (int)err, cudaGetErrorString(err));
  15. DEVICE_RESET
  16. exit(EXIT_FAILURE);
  17. }
  18. }

0_Simple__cppIntegration的更多相关文章

随机推荐

  1. Spring 学习——基于Spring WebSocket 和STOMP实现简单的聊天功能

    本篇主要讲解如何使用Spring websocket 和STOMP搭建一个简单的聊天功能项目,里面使用到的技术,如websocket和STOMP等会简单介绍,不会太深,如果对相关介绍不是很了解的,请自 ...

  2. Dom4J生成xml和包含CDATA问题

    在 java注解生成xml和包含CDATA问题里面做了介绍,这里直接贴代码. 1:生成xml的java文件 package com.dufy.test.xml; import java.io.File ...

  3. Object.defineProperty()方法的用法详解

    Object.defineProperty()函数是给对象设置属性的. Object.defineProperty(object, propertyname, descriptor); 一共有三个参数 ...

  4. HDFS概述(4)————HDFS权限

    概述 Hadoop分布式文件系统(HDFS)的权限模型与POSIX模型的文件和目录权限模型一致.每个文件和目录与所有者和组相关联.该文件或目录将权限划分为所有者的权限,作为该组成员的其他用户的权限.以 ...

  5. ThreadLocal的理解与应用场景分析

    对于Java ThreadLocal的理解与应用场景分析 一.对ThreadLocal理解 ThreadLocal提供一个方便的方式,可以根据不同的线程存放一些不同的特征属性,可以方便的在线程中进行存 ...

  6. vue-chat项目之重构与体验优化

    前言 vue-chat 也就是我的几个月之前写的一个基于vue的实时聊天项目,到目前为止已经快满400star了,注册量也已经超过了1700+,消息量达2000+,由于一直在实习,没有时间对它频繁地更 ...

  7. MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据

    记录通过.frm和.ibd文件恢复数据到本地 .frm文件:保存了每个表的元数据,包括表结构的定义等: .ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per ...

  8. slf4j+log4j在Java中实现日志记录

    小Alan今天来跟大家聊聊开发中既简单又常用但必不可少的一样东西,那是什么呢?那就是日志记录,日志输出,日志保存. 后面就统一用日志记录四个字来形容啦. 日志记录是项目的开发中必不可少的一个环节,特别 ...

  9. 数据迁移过程中hive sql调优

    本文记录的是,在数据处理过程中,遇到了一个sql执行很慢,对一些大型的hive表还会出现OOM,一步一步通过参数的设置和sql优化,将其调优的过程. 先上sql ) t where t.num =1) ...

  10. iKcamp出品|微信小程序|工具安装+目录说明|基于最新版1.0开发者工具初中级教程分享

    iKcamp官网:http://www.ikcamp.com 访问官网更快阅读全部免费分享课程:<iKcamp出品|全网最新|微信小程序|基于最新版1.0开发者工具之初中级培训教程分享>. ...