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的更多相关文章
随机推荐
- JAVA设计模式总结之六大设计原则
从今年的七月份开始学习设计模式到9月底,设计模式全部学完了,在学习期间,总共过了两篇:第一篇看完设计模式后,感觉只是脑子里面有印象但无法言语.于是决定在看一篇,到9月份第二篇设计模式总于看完了,这一篇 ...
- Element-ui Theme浅析
一.浅析 1.采用BEM方式管理类名 B:block,模块,一个块是一个独立的实体,块可以包含其它块,名字单词间用-连接:如一个搜索块: E:element,元素,一个元素是块的一部分,具有某种功能, ...
- window开启remote desktop服务
确定自己的PC支持远程桌面 1 先确定被遥控的电脑的系统必须是Professional或Enterprise以上版本,家庭版不支持远程桌面.以Win8.1(7和8同理)为例,依次打开控制面板→系统 ...
- 学习Ajax
1.XHR对象 IE7+.Firefox.Opera.Chrome和Safari都支持原生XMLHttpRequest对象,IE6不支持,只支持ActiveXObject对象,该对象在IE11中已经不 ...
- 基于EF Core的Code First模式的DotNetCore快速开发框架
前言 最近接了几个小单子,因为是小单子,项目规模都比较小,业务相对来说,也比较简单.所以在选择架构的时候,考虑到效率方面的因素,就采取了asp.net+entity framework中的code f ...
- OC实现同步访问属性
有时候,我们在开发过程中需要对属性的访问进行同步操作,这种属性需要做成原子的,用atomic来修饰属性,即可实现这一点. 如果我们想自己实现,可以按照下面方式写代码: SFPerson.h #impo ...
- 搭建Hadoop平台(新手入门)
刚刚大学毕业,接触大数据有一年的时间了,把自己的一些学习笔记分享给大家,希望同热爱大数据的伙伴们一起学习,成长! 资料准备: Hadoop-2.7.1下载:http://pan.baidu.com/s ...
- UVa1630,Folding
区间dp,记忆化搜就可以 st为原串 dp[p][q]存st[p]~st[q]的最优长度,f[p][q]存对应的最优串 从(0,len-1)开始搜,f[0][len-1]为所求ans,回溯条件为p== ...
- LDAP服务部署
1.安装基本环境 # yum -y install openldap openldap-devel openldap-servers openldap-clients 2.配置LDAP服务端 (1)拷 ...
- Python 第十三节 文件操作
A 1.首先文件读写操作有以下几种模式: a\a+ w\w+ r\r+ a模式:追加_写入模式,写入指针默认在开头,如果文件存在将在开头追加写入,如果文件不存在将创建文件再写入. a+模式: ...