在核函数代码中加入并行线程执行(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的更多相关文章

随机推荐

  1. IIC-BUS INTERFACE

    I2C总线是由Philips公司开发的一种简单.双向二线制同步串行总线.它只需要两根线即可在连接于总线上的器件之间传送信息. To control multi-master IIC-bus opera ...

  2. Linux 内核模块程序结构

    1.内核加载函数 即我们常说的内核入口函数,当内核被加载的时候调用,在内核入口函数中多进行设备的注册和初始化,其中最常用的莫过于module_init().insmod xxx.ko的时候调用. 通常 ...

  3. 记录各种IE兼容问题,IE6,IE7,IE8,IE9,IE10

     记录遇到的IE BUG:  1.IE8开发者工具打不开 解决办法:IE8新增了开发人员工具,非常不错,比早期的DevToolbar好用多了.不过在我的Win7下 使用的时候偶尔会出现一个莫名其妙的问 ...

  4. 【Linux笔记(001) 】-- centos7 系统目录结构与文件

    一.目录结构与用途: /boot:系统引导文件.内核 /bin:用户的基本命令 /dev:设备文件 /etc:配置文件 /home:用户目录 /root:root用户目录 /sbin:管理类的基本命令 ...

  5. How many Knight Placing? UVA - 11091

    How many Knight Placing? Time Limit: 3000MS   Memory Limit: Unknown   64bit IO Format: %lld & %l ...

  6. 三大开源运维监控工具zabbix、nagios、open-falcon优缺点比较

    借鉴一下别人的,自己做个记录,我觉得推荐还是使用open-falcon,最重要的一点是有完善的中文帮助文档. 帮助文档地址:https://book.open-falcon.org/zh/index. ...

  7. 学习如何看懂SQL Server执行计划(一)——数据查询篇

    一.数据查询部分 1. 看到执行计划有两种方式,对sql语句按Ctrl+L,或按Ctrl+M打开显示执行计划窗口每次执行sql都会显示出相应的执行计划 2. 执行计划的图表是从右向左看的 3. SQL ...

  8. Block使用的简单总结

    一.Block简单的使用 1.block当作参数来传递 如下定义一个没有返回值无参数的block,并把它作为参数,让系统调用,注意:这里是系统在调用,不是我们调用 那么为什么需要把block当作参数去 ...

  9. html阶段测试

    1.简述src和href的区别? 2.在html页面的head中定义属性<meta http-equiv="X-UA-Compatible" content="IE ...

  10. 学习flex布局(弹性布局)

    Flex是Flexible Box的缩写,意为弹性布局.是W3C早期提出的一个新的布局方案.可以便捷的实现页面布局,目前较高版本的主流浏览器都能兼容,兼容情况如下: Flex在移动端开发上已是主流,比 ...