我试图用一段简单的代码来测试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
有人可以解释原因吗?
答案 0 :(得分:3)
您需要使用tex1Dfetch()
,因为纹理绑定到线性内存:
printf("%.3f\t%.3f\n", tex1Dfetch( texX, i ), X[i] );
答案 1 :(得分:0)
来自&#34; CUDA C编程指南&#34;
tex1D 用于从一维纹理对象指定的 CUDA数组中获取...
tex1Dfetch 用于从一维纹理指定的线性内存区域中获取...
所以,如果你使用cudaMalloc来malloc线性内存而不是cuda数组,你应该选择 tex1Dfetch