0_Simple__cppIntegration
▶ 分离编译【留坑,在 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的更多相关文章
随机推荐
- Spring 学习——基于Spring WebSocket 和STOMP实现简单的聊天功能
本篇主要讲解如何使用Spring websocket 和STOMP搭建一个简单的聊天功能项目,里面使用到的技术,如websocket和STOMP等会简单介绍,不会太深,如果对相关介绍不是很了解的,请自 ...
- Dom4J生成xml和包含CDATA问题
在 java注解生成xml和包含CDATA问题里面做了介绍,这里直接贴代码. 1:生成xml的java文件 package com.dufy.test.xml; import java.io.File ...
- Object.defineProperty()方法的用法详解
Object.defineProperty()函数是给对象设置属性的. Object.defineProperty(object, propertyname, descriptor); 一共有三个参数 ...
- HDFS概述(4)————HDFS权限
概述 Hadoop分布式文件系统(HDFS)的权限模型与POSIX模型的文件和目录权限模型一致.每个文件和目录与所有者和组相关联.该文件或目录将权限划分为所有者的权限,作为该组成员的其他用户的权限.以 ...
- ThreadLocal的理解与应用场景分析
对于Java ThreadLocal的理解与应用场景分析 一.对ThreadLocal理解 ThreadLocal提供一个方便的方式,可以根据不同的线程存放一些不同的特征属性,可以方便的在线程中进行存 ...
- vue-chat项目之重构与体验优化
前言 vue-chat 也就是我的几个月之前写的一个基于vue的实时聊天项目,到目前为止已经快满400star了,注册量也已经超过了1700+,消息量达2000+,由于一直在实习,没有时间对它频繁地更 ...
- MySQL innodb引擎下根据.frm和.ibd文件恢复表结构和数据
记录通过.frm和.ibd文件恢复数据到本地 .frm文件:保存了每个表的元数据,包括表结构的定义等: .ibd文件:InnoDB引擎开启了独立表空间(my.ini中配置innodb_file_per ...
- slf4j+log4j在Java中实现日志记录
小Alan今天来跟大家聊聊开发中既简单又常用但必不可少的一样东西,那是什么呢?那就是日志记录,日志输出,日志保存. 后面就统一用日志记录四个字来形容啦. 日志记录是项目的开发中必不可少的一个环节,特别 ...
- 数据迁移过程中hive sql调优
本文记录的是,在数据处理过程中,遇到了一个sql执行很慢,对一些大型的hive表还会出现OOM,一步一步通过参数的设置和sql优化,将其调优的过程. 先上sql ) t where t.num =1) ...
- iKcamp出品|微信小程序|工具安装+目录说明|基于最新版1.0开发者工具初中级教程分享
iKcamp官网:http://www.ikcamp.com 访问官网更快阅读全部免费分享课程:<iKcamp出品|全网最新|微信小程序|基于最新版1.0开发者工具之初中级培训教程分享>. ...