来自 2D 数组 CUDA 的 2D 纹理

2023-12-10

我试图将 Nx3 数组传递给内核,并像在纹理内存中一样从中读取并写入第二个数组。这是我的简化代码,其中 N=8:

#include <cstdio>
#include "handle.h"
using namespace std;

texture<float,2> tex_w;

__global__ void kernel(int imax, float(*w)[3], float (*f)[3])
{
  int i = threadIdx.x;
  int j = threadIdx.y;

  if(i<imax)
      f[i][j] = tex2D(tex_w, i, j);
}

void print_to_stdio(int imax, float (*w)[3])
{
  for (int i=0; i<imax; i++)
    {
      printf("%2d  %3.6f\t  %3.6f\t %3.6f\n",i, w[i][0], w[i][1], w[i][2]);
    }
}

int main(void)
{
  int imax = 8;
  float (*w)[3];
  float (*d_w)[3], (*d_f)[3];
  dim3 grid(imax,3);

  w = (float (*)[3])malloc(imax*3*sizeof(float));

  for(int i=0; i<imax; i++)
    {
      for(int j=0; j<3; j++)
        {
          w[i][j] = i + 0.01f*j;
        }
    }

  cudaMalloc( (void**) &d_w, 3*imax*sizeof(float) );
  cudaMalloc( (void**) &d_f, 3*imax*sizeof(float) );

  cudaChannelFormatDesc desc = cudaCreateChannelDesc<float>();
  HANDLE_ERROR( cudaBindTexture2D(NULL, tex_w, d_w, desc, imax, 3, sizeof(float)*imax ) );

  cudaMemcpy(d_w, w, 3*imax*sizeof(float), cudaMemcpyHostToDevice);

  // just use threads for simplicity                                                                  
  kernel<<<1,grid>>>(imax, d_w, d_f);

  cudaMemcpy(w, d_f, 3*imax*sizeof(float), cudaMemcpyDeviceToHost);

  cudaUnbindTexture(tex_w);
  cudaFree(d_w);
  cudaFree(d_f);

  print_to_stdio(imax, w);

  free(w);
  return 0;
}

运行这段代码我希望得到:

0  0.000000   0.010000   0.020000
1  1.000000   1.010000   1.020000
2  2.000000   2.010000   2.020000
3  3.000000   3.010000   3.020000
4  4.000000   4.010000   4.020000
5  5.000000   5.010000   5.020000
6  6.000000   6.010000   6.020000
7  7.000000   7.010000   7.020000

但我得到的是:

0  0.000000   2.020000   5.010000
1  0.010000   3.000000   5.020000
2  0.020000   3.010000   6.000000
3  1.000000   3.020000   6.010000
4  1.010000   4.000000   6.020000
5  1.020000   4.010000   7.000000
6  2.000000   4.020000   7.010000
7  2.010000   5.000000   7.020000

我认为这与我给 cudaBindTexture2D 的音高参数有关,但使用较小的值会产生无效参数错误。

提前致谢!


在布拉诺的回应并更多地研究音调的工作原理之后,我将回答我自己的问题。这是修改后的代码:

#include <cstdio>
#include <iostream>
#include "handle.cu"

using namespace std;

texture<float,2,cudaReadModeElementType> tex_w;

__global__ void kernel(int imax, float (*f)[3])
{
  int i = threadIdx.x;
  int j = threadIdx.y;
  // width = 3, height = imax                                                                         
  // but we have imax threads in x, 3 in y                                                            
  // therefore height corresponds to x threads (i)                                                    
  // and width corresponds to y threads (j)                                                           
  if(i<imax)
    {
      // linear filtering looks between indices                                                       
      f[i][j] = tex2D(tex_w, j+0.5f, i+0.5f);
    }
}

void print_to_stdio(int imax, float (*w)[3])
{
  for (int i=0; i<imax; i++)
    {
      printf("%2d  %3.3f  %3.3f  %3.3f\n",i, w[i][0], w[i][1], w[i][2]);
    }
  printf("\n");
}

int main(void)
{
  int imax = 8;
  float (*w)[3];
  float (*d_f)[3], *d_w;
  dim3 grid(imax,3);

  w = (float (*)[3])malloc(imax*3*sizeof(float));

  for(int i=0; i<imax; i++)
    {
      for(int j=0; j<3; j++)
        {
          w[i][j] = i + 0.01f*j;
        }
    }

  print_to_stdio(imax, w);

  size_t pitch;
  HANDLE_ERROR( cudaMallocPitch((void**)&d_w, &pitch, 3*sizeof(float), imax) );

  HANDLE_ERROR( cudaMemcpy2D(d_w,             // device destination                                   
                             pitch,           // device pitch (calculated above)                      
                             w,               // src on host                                          
                             3*sizeof(float), // pitch on src (no padding so just width of row)       
                             3*sizeof(float), // width of data in bytes                               
                             imax,            // height of data                                       
                             cudaMemcpyHostToDevice) );

  HANDLE_ERROR( cudaBindTexture2D(NULL, tex_w, d_w, tex_w.channelDesc, 3, imax, pitch) );

  tex_w.normalized = false;  // don't use normalized values                                           
  tex_w.filterMode = cudaFilterModeLinear;
  tex_w.addressMode[0] = cudaAddressModeClamp; // don't wrap around indices                           
  tex_w.addressMode[1] = cudaAddressModeClamp;

  // d_f will have result array                                                                       
  cudaMalloc( &d_f, 3*imax*sizeof(float) );

  // just use threads for simplicity                                                                  
  kernel<<<1,grid>>>(imax, d_f);

  cudaMemcpy(w, d_f, 3*imax*sizeof(float), cudaMemcpyDeviceToHost);

  cudaUnbindTexture(tex_w);
  cudaFree(d_w);
  cudaFree(d_f);

  print_to_stdio(imax, w);

  free(w);
  return 0;
}

使用 memcpy2D() 可以接受设备数据和主机数据的音高参数,而不是使用 memcpy() 来处理主机上的音高。由于我们在主机上使用简单分配的数据,因此我的理解是间距只是行宽度,或 3*sizeof(float)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

来自 2D 数组 CUDA 的 2D 纹理 的相关文章

  • 是否可以在设备函数中调用cufft库调用?

    我在主机代码中使用 cuFFT 库调用 它们工作正常 但我想从内核调用 cuFFT 库 早期版本的 CUDA 没有这种支持 但是有了动态并行性 这可能吗 如果有任何关于如何实现这一目标的示例 那就太好了 尽管在 Kepler cc 3 5
  • CUDA:如何检查计算能力是否正确?

    使用较高计算能力编译的 CUDA 代码将在计算能力较低的设备上完美执行很长一段时间 然后有一天在某些内核中默默地失败 我花了半天时间追寻一个难以捉摸的错误 结果发现构建规则已经sm 21而该设备 Tesla C2050 是2 0 是否有任何
  • 使用 CUDA __device__ 函数时出现链接器错误 2005 和 1169(多重定义的符号)(默认情况下应内联)

    这个问题与以下问题有很大关系 A 如何将CUDA代码分成多个文件 https stackoverflow com questions 2090974 how to separate cuda code into multiple files
  • 为什么 gcc 和 NVCC (g++) 会看到两种不同的结构大小?

    我正在尝试将 CUDA 添加到 90 年代末编写的现有单线程 C 程序中 为此 我需要混合两种语言 C 和 C nvcc 是 c 编译器 问题在于 C 编译器将结构视为特定大小 而 C 编译器将相同的结构视为略有不同的大小 那很糟 我对此感
  • cuda cpu功能-gpu内核重叠

    我在尝试开发以练习 CUDA 的 CUDA 应用程序时遇到并发问题 我想通过使用 cudaMemecpyAsync 和 CUDA 内核的异步行为来共享 GPU 和 CPU 之间的工作 但我无法成功重叠 CPU 执行和 GPU 执行 它与主机
  • 传递给 CUDA 的结构中的指针

    我已经搞砸了一段时间了 但似乎无法正确处理 我正在尝试将包含数组的对象复制到 CUDA 设备内存中 然后再复制回来 但当我遇到它时我会跨过那座桥 struct MyData float data int dataLen void copyT
  • 在linux上编译一个基本的OpenCV + Cuda程序

    我过去在linux上使用过opencv 但没有使用过cuda 几个月来我一直在与以下编译错误作斗争 在尝试了许多解决方案后 我放弃并使用 Windows 不过 我真的很想在 Linux 上工作 这是我用来编译 opencv gpu 网站上给
  • 运行时 API 应用程序中的 cuda 上下文创建和资源关联

    我想了解如何在 cuda 运行时 API 应用程序中创建 cuda 上下文并与内核关联 我知道这是由驱动程序 API 在幕后完成的 但我想了解一下创作的时间线 首先 我知道 cudaRegisterFatBinary 是第一个 cuda a
  • __syncthreads() 死锁

    如果只有部分线程执行 syncthreads 会导致死锁吗 我有一个这样的内核 global void Kernel int N int a if threadIdx x
  • 加速Cuda程序

    要更改哪一部分来加速此代码 代码到底在做什么 global void mat Matrix a Matrix b int tempData new int 2 tempData 0 threadIdx x tempData 1 blockI
  • 尝试构建我的 CUDA 程序时出现错误 MSB4062

    当我尝试构建我的第一个 GPU 程序时 出现以下错误 有什么建议可能会出什么问题吗 错误 1 错误 MSB4062 Nvda Build CudaTasks SanitizePaths 任务 无法从程序集 C Program 加载 文件 M
  • cuda中有模板化的数学函数吗? [复制]

    这个问题在这里已经有答案了 我一直在寻找 cuda 中的模板化数学函数 但似乎找不到 在普通的 C 中 如果我调用std sqrt它是模板化的 并且将根据参数是浮点数还是双精度数执行不同的版本 我想要这样的 CUDA 设备代码 我的内核将真
  • 使用 CUDA 进行逐元素向量乘法

    我已经在 CUDA 中构建了一个基本内核来执行逐元素两个复向量的向量 向量乘法 内核代码插入如下 multiplyElementwise 它工作正常 但由于我注意到其他看似简单的操作 如缩放向量 在 CUBLAS 或 CULA 等库中进行了
  • 在 cudaFree() 之前需要 cudaDeviceSynchronize() 吗?

    CUDA 版本 10 1 帕斯卡 GPU 所有命令都发送到默认流 void ptr cudaMalloc ptr launch kernel lt lt lt gt gt gt ptr cudaDeviceSynchronize Is th
  • TensorRT 多线程

    我正在尝试使用 python API 来使用 TensorRt 我试图在多个线程中使用它 其中 Cuda 上下文与所有线程一起使用 在单个线程中一切正常 我使用 docker 和 tensorrt 20 06 py3 图像 onnx 模型和
  • 如何使用 CUDA/Thrust 对两个数组/向量根据其中一个数组中的值进行排序

    这是一个关于编程的概念问题 总而言之 我有两个数组 向量 我需要对一个数组 向量进行排序 并将更改传播到另一个数组 向量中 这样 如果我对 arrayOne 进行排序 则对于排序中的每个交换 arrayTwo 也会发生同样的情况 现在 我知
  • 通过 cuFFT 进行逆 FFT 缩放

    每当我使用 cuFFT 绘制程序获得的值并将结果与 Matlab 的结果进行比较时 我都会得到相同形状的图形 并且最大值和最小值位于相同的点 然而 cuFFT 得到的值比 Matlab 得到的值大得多 Matlab代码是 fs 1000 s
  • “gld/st_throughput”和“dram_read/write_throughput”指标之间有什么区别?

    在 CUDA 可视化分析器版本 5 中 我知道 gld st requested throughput 是应用程序请求的内存吞吐量 然而 当我试图找到硬件的实际吞吐量时 我很困惑 因为有两对似乎合格的指标 它们是 gld st throug
  • cuda-gdb 错误消息

    我尝试使用 cuda gdb 调试我的 CUDA 应用程序 但遇到了一些奇怪的错误 我设置了选项 g G O0构建我的应用程序 我可以在没有 cuda gdb 的情况下运行我的程序 但没有得到正确的结果 因此我决定使用 cuda gdb 但
  • CUDA 5.0错误LNK2001:cuda方法无法解析的外部符号

    我的链接器有错误 1 gt ManifestResourceCompile 1 gt All outputs are up to date 1 gt kernel cu obj error LNK2001 unresolved extern

随机推荐

  • 对一组值进行排序

    我有这样的价值观 x set 0 000000000 0 009518000 10 277200999 0 030810999 0 018384000 4 918560000 y set 4 918859000 0 060758000 4
  • 如何使用 PHP 将 mysql 转换为 sqlite3

    我在 mysql 服务器上有一个数据库 我想将其转换为 sqlite3 数据库without使用 shell 或 perl 脚本 我需要一些使用 PHP 转换相同内容的帮助 任何帮助 将不胜感激 仅使用 PHP 会相当麻烦 您必须从 mys
  • 将带有位置、颜色等的 networkx 图写入 gexf

    我使用 networkx 构建了一个图表 并使用 spring 布局函数生成了一个漂亮的图 不幸的是 这没有传输到 gexf 文件 我认为networkx工具的重点是能够编写可读的图形文件 所以如果python中有一个简单的解决方案 我会犹
  • 无法在 CentOS 7 上安装 mpi4py

    我有 CentOS 7 并且已经安装了 mpicc 它可以在 C 语言中为 openmpi 工作和编译 我也有 python 2 7 5 并且刚刚安装了 pip 我正在运行此命令并收到以下错误 sudo pip install mpi4py
  • RestKit 核心数据 NSError dealloc 崩溃

    试图找出我在生产版本中看到的问题的根源 并最终能够在测试时重现它 使用 RestKit v0 23 1 当使用以下代码 插入仪器时 执行 RKManagedObjectRequestOperation 时 我收到 一条 Objective
  • 如何用C语言解析HTTP响应?

    我正在编写一个小项目 它使用 HTTP 1 1 GET 和 POST 与一组服务器进行交互 服务器在一些标题行后给了我响应 所以我想使用strtok 函数使用 n作为分隔符 但每当我尝试这样做时就会发生崩溃 有没有简单的方法可以用 C 语言
  • Android:无法在防火墙后面发出 httprequest

    当没有防火墙时 标准 getUrlContent 可以很好地工作 但当我尝试在防火墙后面执行此操作时 我遇到了例外 我尝试在 AVD 管理器中设置 http 代理服务器 但没有成功 知道如何正确设置它吗 顺便说一句 来自 android 文
  • 浮动比较给出不同的结果

    看下面两个代码 告诉我答案差异很大的原因 include
  • 将 cumsum 应用于二元向量

    我有一个简单的二元向量a我尝试将其转换为向量b使用 R 函数cumsum 然而 cumsum不完全返回向量b 这是一个例子 a lt c 1 0 0 0 1 1 1 1 0 0 1 0 0 0 1 1 b lt c 1 2 2 2 3 4
  • 在 Asp.net MVC 网站中生成 Excel XML 文档

    我有一个 ASP Net MVC 站点 可以生成 Microsoft Excel 2003 XML 格式的电子表格 电子表格看起来不错 控制器和视图都可以工作 但文件无法在 Excel 中打开 它在浏览器中打开 因为它是 XML 文档 我尝
  • 我在 Android studio 中找不到“图像资源”选项

    我开始使用 Flutter UI 工具包在 Android Studio 中学习应用程序开发 一切看起来都很好 但是当我想创建一个新图像资源要编辑我的应用程序的图标 我找不到它 当我右键单击安卓 应用程序 src main res文件夹 它
  • 如何使用 Rally REST .NET 将附件添加到用户故事

    我们正在将 NET Rally 代码从 SOAP 移植到 REST NET API 到目前为止 REST API 似乎更快并且更易于使用 因为每次工作产品自定义字段在 Rally 工作区中发生更改时都不会破坏 WSDL 不过 当我们尝试复制
  • 如何从终端运行Java程序?

    我正在尝试从我的终端运行 Java 程序 我有 Mac OS X 10 7 teamL javac jar kxml2 2 3 0 jar XMLHandler java ServiceEndpoint java TeamL java 这是
  • 如何使ResourceResponse将请求转发到liferay portlet中的错误页面

    当生成 Excel 工作表期间发生错误时 我试图将我的请求转发到错误页面 下面是示例代码 我不确定为什么抛出异常时它没有转发到错误页面 它显示空白页面但肯定不会转到我的错误页面 ResourceMapping xyz public void
  • 如果我在应用程序内访问 iPhone 序列号,App Store 是否允许这样做?

    我读过有关 IOKit Extension 的信息 用于从应用程序内的 iPhone 获取序列号 博客 jdevelop eu 其实我知道应用程序商店中有一个应用程序可以读取序列号并显示它 现在怎么办 是否允许 有什么经验吗 来自开发者网站
  • 将整数转换为字符串以在运行时创建输出文件名

    我有一个 Fortran 程序 可以将结果保存到文件中 目前我使用打开文件 OPEN 1 FILE Output TXT 但是 我现在想运行一个循环 并将每次迭代的结果保存到文件中 Output1 TXT Output2 TXT Outpu
  • 为什么打开word文档时会生成~$开头的文件?

    我们都可能已经注意到创建了一个名为 filename docx 隐藏 打开时filename docx使用 MS Word 该文件的目的是什么 它为何被创建以及它包含什么 它维护有关文档当前状态的临时信息 您是否遇到过崩溃 当您打开 Wor
  • 即使 userInteractionEnabled 设置为 NO,UITextField 也会显示光标

    我有一个 UITextField 它必须让光标闪烁 即使它的 userInteractionEnabled 属性设置为 NO 我不希望 UITextField 成为FirstResponder 并显示键盘 现在你可能会问 1 如果要隐藏键盘
  • CALayers 没有因 UIView 的边界变化而调整大小。为什么?

    我有一个UIView其中大约有8种不同的CALayer添加到其图层的子图层 如果我修改视图的边界 动画 然后视图本身缩小 我用backgroundColor but 子层的大小保持不变 怎么解决这个问题呢 我使用了与 Solin 相同的方法
  • 来自 2D 数组 CUDA 的 2D 纹理

    我试图将 Nx3 数组传递给内核 并像在纹理内存中一样从中读取并写入第二个数组 这是我的简化代码 其中 N 8 include