0_Simple__inlinePTX + 0_Simple__inlinePTX_nvrtc
在核函数代码中加入并行线程执行(Parallel Thread eXecution,PTX),通过汇编指令获取得有关线程束的信息。并且在静态代码和运行时编译两种条件下使用。
▶ 源代码:静态使用
#include <stdio.h>
#include <assert.h>
#include <cuda_runtime.h>
#include "device_launch_parameters.h"
#include <helper_functions.h>
#include <helper_cuda.h> __global__ void sequence_gpu(int *d_ptr, int length)
{
int elemID = blockIdx.x * blockDim.x + threadIdx.x; if (elemID < length)
{
unsigned int laneid;
asm("mov.u32 %0, %%laneid;" : "=r"(laneid));// 获取当前线程在线程束中的编号
d_ptr[elemID] = laneid;
}
} void sequence_cpu(int *h_ptr, int length)
{
for (int elemID=; elemID<length; elemID++)
h_ptr[elemID] = elemID % ;
} int main(int argc, char **argv)
{
printf("CUDA inline PTX assembler sample\n"); const int N = ; int dev = findCudaDevice(argc, (const char **) argv);
if (dev == -)
return EXIT_FAILURE; int *d_ptr;
cudaMalloc(&d_ptr, N * sizeof(int));
int *h_ptr;
cudaMallocHost(&h_ptr, N * sizeof(int)); dim3 cudaBlockSize(,,);
dim3 cudaGridSize((N + cudaBlockSize.x - ) / cudaBlockSize.x, , );
sequence_gpu<<<cudaGridSize, cudaBlockSize>>>(d_ptr, N);
cudaGetLastError();
cudaDeviceSynchronize(); sequence_cpu(h_ptr, N); int *h_d_ptr;
cudaMallocHost(&h_d_ptr, N *sizeof(int));
cudaMemcpy(h_d_ptr, d_ptr, N *sizeof(int), cudaMemcpyDeviceToHost); bool bValid = true; for (int i=; i<N && bValid; i++)
{
if (h_ptr[i] != h_d_ptr[i])
bValid = false;
} printf("Test %s.\n", bValid ? "Successful" : "Failed"); cudaFree(d_ptr);
cudaFreeHost(h_ptr);
cudaFreeHost(h_d_ptr); getchar();
return bValid ? EXIT_SUCCESS: EXIT_FAILURE;
}
▶ 源代码:运行时编译
/*inlinePTX_kernel.cu*/
extern "C" __global__ void sequence_gpu(int *d_ptr, int length)
{
int elemID = blockIdx.x * blockDim.x + threadIdx.x;
if (elemID < length)
{
unsigned int laneid;
asm("mov.u32 %0, %%laneid;" : "=r"(laneid));
d_ptr[elemID] = laneid;
}
}
/*inlinePTX.cpp*/
#include <stdio.h>
#include <assert.h>
#include <cuda_runtime.h>
#include <nvrtc_helper.h>
#include <helper_functions.h> void sequence_cpu(int *h_ptr, int length)
{
for (int elemID=; elemID<length; elemID++)
h_ptr[elemID] = elemID % ;
} int main(int argc, char **argv)
{
printf("CUDA inline PTX assembler sample\n"); char *ptx, *kernel_file;
size_t ptxSize; kernel_file = sdkFindFilePath("inlinePTX_kernel.cu", argv[]);
compileFileToPTX(kernel_file, , NULL, &ptx, &ptxSize);
CUmodule module = loadPTX(ptx, argc, argv);
CUfunction kernel_addr;
cuModuleGetFunction(&kernel_addr, module, "sequence_gpu"); const int N = ;
int *h_ptr = (int *)malloc(N * sizeof(int)); dim3 cudaBlockSize(,,);
dim3 cudaGridSize((N + cudaBlockSize.x - ) / cudaBlockSize.x, , );
CUdeviceptr d_ptr;
cuMemAlloc(&d_ptr, N * sizeof(int)); void *arr[] = { (void *)&d_ptr, (void *)&N };
cuLaunchKernel(kernel_addr,
cudaGridSize.x, cudaGridSize.y, cudaGridSize.z,
cudaBlockSize.x, cudaBlockSize.y, cudaBlockSize.z,
, , &arr[], ); cuCtxSynchronize();
sequence_cpu(h_ptr, N);
int *h_d_ptr = (int *)malloc(N * sizeof(int));;
cuMemcpyDtoH(h_d_ptr, d_ptr, N *sizeof(int)); bool bValid = true;
for (int i=; i<N && bValid; i++)
{
if (h_ptr[i] != h_d_ptr[i])
bValid = false;
} printf("Test %s.\n", bValid ? "Successful" : "Failed");
cuMemFree(d_ptr); getchar();
return bValid ? EXIT_SUCCESS: EXIT_FAILURE;
}
▶ 输出结果:
CUDA inline PTX assembler sample
GPU Device : "GeForce GTX 1070" with compute capability 6.1 Test Successful.
▶ 涨姿势:
● 获取当前线程在线程束中的编号,即同意先乘数中的线程分别获得值 0 ~ 31
asm("mov.u32 %0, %%laneid;" : "=r"(laneid));
0_Simple__inlinePTX + 0_Simple__inlinePTX_nvrtc的更多相关文章
随机推荐
- C语言bitmap的使用技巧
bitmap是一种以位的状态来表示某种特性的状态的一种操作方式,类似嵌入式中的寄存器操作,在表示某种特性enable/disable的时候很适用且占用的内存空间也很小 比如:做过交换机或者企业网管,路 ...
- 记录各种IE兼容问题,IE6,IE7,IE8,IE9,IE10
记录遇到的IE BUG: 1.IE8开发者工具打不开 解决办法:IE8新增了开发人员工具,非常不错,比早期的DevToolbar好用多了.不过在我的Win7下 使用的时候偶尔会出现一个莫名其妙的问 ...
- Spring-boot:5分钟整合Dubbo构建分布式服务
概述: Dubbo是Alibaba开源的分布式服务框架,它最大的特点是按照分层的方式来架构,使用这种方式可以使各个层之间解耦合(或者最大限度地松耦合).从服务模型的角度来看,Dubbo采用的是一种非常 ...
- UNREFERENCED_PARAMETER
作用:告诉编译器,已经使用了该变量,不必检测警告! 在VC编译器下,如果您用最高级别进行编译,编译器就会很苛刻地指出您的非常细小的警告.当你生命了一个变量,而没有使用时,编译器就会报警告:" ...
- Django 1.10中文文档-执行查询
Django 1.10中文文档: https://github.com/jhao104/django-chinese-doc 只要创建好 数据模型, Django 会自动为生成一套数据库抽象的API, ...
- cellForItemAtIndexPath没有调用
前几天碰到cellForItemAtIndexPath这个数据源方法没有被调用.这是一个collectionView返回cell(item)的数据源方法. 它没有被调用的原因有下: 1.没有设置del ...
- 基于FPGA的肤色识别算法实现
大家好,给大家介绍一下,这是基于FPGA的肤色识别算法实现. 我们今天这篇文章有两个内容一是实现基于FPGA的彩色图片转灰度实现,然后在这个基础上实现基于FPGA的肤色检测算法实现. 将彩色图像转化为 ...
- Java视频扩展知识 线程池的了解
Java视频扩展知识 线程池的了解 1.简单介绍: Jdk1.5之后加入了java.util.concurrent包,这个包中主要介绍java中线程以及线程池的使用.为我们在开发中处理线程的 ...
- c# Socket通讯中关于粘包,半包的处理,加分割符
using System; using System.Collections.Generic; using System.Text; using System.Net.Sockets; using S ...
- 【网络爬虫入门02】HTTP客户端库Requests的基本原理与基础应用
[网络爬虫入门02]HTTP客户端库Requests的基本原理与基础应用 广东职业技术学院 欧浩源 1.引言 实现网络爬虫的第一步就是要建立网络连接并向服务器或网页等网络资源发起请求.urllib是 ...