2

我正在尝试用一段简单的代码测试 CUDA 1D 纹理。这很简单:首先分配一个全局内存,然后将其绑定到纹理引用;通过 tex1D() 从内核中访问纹理;打印出纹理提取返回的值。

代码如下:

#include "cuda.h"
#include "cuda_runtime.h"
#include <iostream>
#include <vector>
#include <cstdio>

using namespace std;

texture<float, cudaTextureType1D, cudaReadModeElementType> texX;

__global__ void kernel(float *X)
{
    int i = threadIdx.x ;
    if ( i >= 128 ) return;
    printf("%.3f\t%.3f\n", tex1D( texX, i*1.0 ), X[i] );
}

int main()
{
    float *devX;
    vector<float> X(128, 3.1415926 );
    cudaMalloc( &devX, 128 * sizeof(float) );
    cudaMemcpy( devX, &X[0], 128*sizeof(float), cudaMemcpyDefault );
    cudaDeviceSynchronize();

    cudaBindTexture( (size_t)0, texX, devX, 128 * sizeof(float) );
    cudaDeviceSynchronize();

    kernel<<<1,128>>>( devX );
    cudaDeviceSynchronize();
    cout<<endl;
    cout<< cudaGetErrorString( cudaGetLastError() ) <<endl;
}

但我得到的只是这样:

0.000    3.142
0.000    3.142
...
0.000    3.142

no error

谁能解释为什么?

4

2 回答 2

3

您需要使用tex1Dfetch(),因为您的纹理绑定到线性内存:

printf("%.3f\t%.3f\n", tex1Dfetch( texX, i ), X[i] );
于 2012-09-13T16:43:46.143 回答
0

来自“ CUDA C 编程指南”

tex1D用于从一维纹理对象指定的CUDA 数组中获取...

tex1Dfetch用于从一维纹理指定的线性内存区域中获取...

所以,如果你使用 cudaMalloc 分配线性内存而不是 cuda 数组,你应该选择tex1Dfetch

于 2017-08-16T13:54:36.520 回答