Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
CUDA 1D纹理提取始终返回0_Cuda_Textures - Fatal编程技术网

CUDA 1D纹理提取始终返回0

CUDA 1D纹理提取始终返回0,cuda,textures,Cuda,Textures,我试图用一段简单的代码测试CUDA 1D纹理。它非常简单:首先分配全局内存,然后将其绑定到纹理引用;通过tex1D()从内核中访问纹理;打印出纹理提取返回的值 代码如下: #include "cuda.h" #include "cuda_runtime.h" #include <iostream> #include <vector> #include <cstdio> using namespace std; texture<float, cudaT

我试图用一段简单的代码测试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;
}

有人能解释一下原因吗?

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

printf("%.3f\t%.3f\n", tex1Dfetch( texX, i ), X[i] );
来自“CUDA C编程指南”

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

tex1Dfetch用于从一维纹理指定的线性内存的区域进行提取

因此,如果您使用cudaMalloc到malloc线性内存,而不是cuda数组,那么您应该选择tex1Dfetch

printf("%.3f\t%.3f\n", tex1Dfetch( texX, i ), X[i] );