CUDA学习(二十二)

简介:

与OpenGL互操作性:
OpenGL(全写Open Graphics Library)是指定义了一个跨编程语言、跨平台的编程接口规格的专业的图形程序接口。它用于三维图像(二维的亦可),是一个功能强大,调用方便的底层图形库。
可以映射到CUDA地址空间的OpenGL资源是OpenGL缓冲区,纹理和渲染缓冲区对象。
一个缓冲区对象使用cudaGraphicsGLRegisterBuffer()注册。 在CUDA中,它显示为一个设备指针,因此可以通过内核或通过cudaMemcpy()调用来读写。
使用cudaGraphicsGLRegisterImage()注册纹理或渲染缓冲区对象。 在CUDA中,它显示为一个CUDA数组。 内核可以通过将数组绑定到纹理或表面引用来读取数组。 如果资源已经用cudaGraphicsRegisterFlagsSurfaceLoadStore标志进行了注册,它们也可以通过表面写入功能写入。 该数组也可以通过cudaMemcpy2D()调用读取和写入。 cudaGraphicsGLRegisterImage()支持所有具有1,2或4个分量和浮点内部类型(例如GL_RGBA_FLOAT32),归一化整数(例如GL_RGBA8,GL_INTENSITY16)和非标准化整数(例如GL_RGBA8UI)的纹理格式(请注意, 非标准化的整数格式需要OpenGL 3.0,它们只能被着色器写入,而不能被固定功能管道写入)。
其资源被共享的OpenGL上下文必须是主线程的当前进行任何OpenGL互操作API调用。
请注意:当一个OpenGL纹理被绑定(例如,通过请求使用glGetTextureHandle / glGetImageHandle API的图像或纹理句柄),它不能被注册到CUDA。 应用程序需要在请求图像或纹理句柄之前注册纹理进行交互。
以下代码示例使用内核动态修改存储在顶点缓冲区对象中的顶点的2D宽x高网格:

GLuint positionsVBO;
struct cudaGraphicsResource* positionsVBO_CUDA;
int main()
{
    // Initialize OpenGL and GLUT for device 0
    // and make the OpenGL context current
    ...
        glutDisplayFunc(display);
    // Explicitly set device 0
    cudaSetDevice(0);
    // Create buffer object and register it with CUDA
    glGenBuffers(1, &positionsVBO);
    glBindBuffer(GL_ARRAY_BUFFER, positionsVBO);
    unsigned int size = width * height * 4 * sizeof(float);
    glBufferData(GL_ARRAY_BUFFER, size, 0, GL_DYNAMIC_DRAW);
    glBindBuffer(GL_ARRAY_BUFFER, 0);
    cudaGraphicsGLRegisterBuffer(&positionsVBO_CUDA,
        positionsVBO,
        cudaGraphicsMapFlagsWriteDiscard);
    // Launch rendering loop
    glutMainLoop();
    ...
}
void display()
{
    // Map buffer object for writing from CUDA
    float4* positions;
    cudaGraphicsMapResources(1, &positionsVBO_CUDA, 0);
    size_t num_bytes;
    cudaGraphicsResourceGetMappedPointer((void**)&positions,
        &num_bytes,
        positionsVBO_CUDA));
        // Execute kernel
        dim3 dimBlock(16, 16, 1);
        dim3 dimGrid(width / dimBlock.x, height / dimBlock.y, 1);
        createVertices << <dimGrid, dimBlock >> >(positions, time,
            width, height);
        // Unmap buffer object
        cudaGraphicsUnmapResources(1, &positionsVBO_CUDA, 0);
        // Render from buffer object
        glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
        glBindBuffer(GL_ARRAY_BUFFER, positionsVBO);
        glVertexPointer(4, GL_FLOAT, 0, 0);
        glEnableClientState(GL_VERTEX_ARRAY);
        glDrawArrays(GL_POINTS, 0, width * height);
        glDisableClientState(GL_VERTEX_ARRAY);
        // Swap buffers
        glutSwapBuffers();
        glutPostRedisplay();
}
void deleteVBO()
{
    cudaGraphicsUnregisterResource(positionsVBO_CUDA);
    glDeleteBuffers(1, &positionsVBO);
}
__global__ void createVertices(float4* positions, float time,
    unsigned int width, unsigned int height)
{
    unsigned int x = blockIdx.x * blockDim.x + threadIdx.x;
    unsigned int y = blockIdx.y * blockDim.y + threadIdx.y;
    // Calculate uv coordinates
    float u = x / (float)width;
    float v = y / (float)height;
    u = u * 2.0f - 1.0f;
    v = v * 2.0f - 1.0f;
    // calculate simple sine wave pattern
    float freq = 4.0f;
    float w = sinf(u * freq + time)
        * cosf(v * freq + time) * 0.5f;
    // Write positions
    positions[y * width + x] = make_float4(u, w, v, 1.0f);
}

在Windows和Quadro GPU上,cudaWGLGetDevice()可用于检索与wglEnumGpusNV()返回的句柄关联的CUDA设备。 Quadro GPU在多GPU配置中提供比GeForce和Tesla GPU更高的OpenGL互操作性,其中在Quadro GPU上执行OpenGL渲染,并在系统中的其他GPU上执行CUDA计算。
u_1076833624_2824088214_fm_27_gp_0

相关实践学习
在云上部署ChatGLM2-6B大模型(GPU版)
ChatGLM2-6B是由智谱AI及清华KEG实验室于2023年6月发布的中英双语对话开源大模型。通过本实验,可以学习如何配置AIGC开发环境,如何部署ChatGLM2-6B大模型。
目录
相关文章
|
Arthas Cloud Native Java
是谁在调用我?使用 arthas+jprofiler 做复杂链路分析
Arthas 是阿里巴巴开源的应用诊断利器,提供了 profiler 命令,可以生成热点火焰图。通过采样录制调用链路来做性能分析,极大提升了线上排查性能问题的效率。
是谁在调用我?使用 arthas+jprofiler 做复杂链路分析
|
设计模式 算法 安全
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
【C/C++ 关键字 函数说明符 】C++ final关键字(修饰成员函数无法被子类重写覆盖)
697 1
|
10月前
|
缓存 并行计算 PyTorch
PyTorch CUDA内存管理优化:深度理解GPU资源分配与缓存机制
本文深入探讨了PyTorch中GPU内存管理的核心机制,特别是CUDA缓存分配器的作用与优化策略。文章分析了常见的“CUDA out of memory”问题及其成因,并通过实际案例(如Llama 1B模型训练)展示了内存分配模式。PyTorch的缓存分配器通过内存池化、延迟释放和碎片化优化等技术,显著提升了内存使用效率,减少了系统调用开销。此外,文章还介绍了高级优化方法,包括混合精度训练、梯度检查点技术及自定义内存分配器配置。这些策略有助于开发者在有限硬件资源下实现更高性能的深度学习模型训练与推理。
1988 0
|
供应链 数据可视化 搜索推荐
商业模式画布BMC入门指南:模块、实操与工具
2分钟了解什么是商业模式画布BMC,哪些工具可以绘制。
1677 11
商业模式画布BMC入门指南:模块、实操与工具
|
安全 搜索推荐 Unix
如何提取指定镜像的 Dockerfile
如何提取指定镜像的 Dockerfile
548 0
|
算法 计算机视觉 Python
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
该文章详细介绍了使用Python和OpenCV进行相机标定以获取畸变参数,并提供了修正图像畸变的全部代码,包括生成棋盘图、拍摄标定图像、标定过程和畸变矫正等步骤。
python利用opencv进行相机标定获取参数,并根据畸变参数修正图像附有全部代码(流畅无痛版)
|
消息中间件 监控 负载均衡
深入理解 Kafka 集群管理与最佳实践
构建和管理一个稳定、高性能的Kafka集群对于实现可靠的消息传递至关重要。本文将深入研究Kafka集群的各个方面,包括集群搭建、节点配置、分区与副本管理、安全性与监控,为读者提供全面的指导和实例代码。
同步、异步、全双工、半双工的区别
同步、异步、全双工、半双工的区别
|
消息中间件 存储
【RabbitMQ五】——RabbitMQ路由模式(Routing)
【RabbitMQ五】——RabbitMQ路由模式(Routing)
777 0

热门文章

最新文章