如何在cuda中将浮点*数组绑定到1D纹理?

如何在cuda中将浮点*数组绑定到1D纹理?,cuda,Cuda,我试图通过将纹理内存绑定到线性设备阵列(而不是cudaArray)来理解如何使用纹理内存。我的代码很简单(如下)。我有一个8个数字的float*数组,我试图将其绑定到一个1D纹理,然后在我的内核函数中,我尝试读取纹理并将值放入一个输出数组。但当我运行此测试时,输出数组中的所有值都为零: 输入=0.0000001.0000002.0000003.0000004.0000005.0000006.0000007.000000 输出=0.0000000.0000000.0000000.0000000.0

我试图通过将纹理内存绑定到线性设备阵列(而不是cudaArray)来理解如何使用纹理内存。我的代码很简单(如下)。我有一个8个数字的float*数组,我试图将其绑定到一个1D纹理,然后在我的内核函数中,我尝试读取纹理并将值放入一个输出数组。但当我运行此测试时,输出数组中的所有值都为零:

输入=0.0000001.0000002.0000003.0000004.0000005.0000006.0000007.000000
输出=0.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.0000000.000000

我错过了什么

texture<float, 1, cudaReadModeElementType> texInput;

__global__ void copyKernel(float*output, int n) {
for (int i = 0; i < n; i++) {
    output[i] = tex1D(texInput, (float)i);
}
}

int main(int argc, char*argv[]) {

const int WIDTH = 8;

float* hInput = (float*)malloc(sizeof(float) * WIDTH);
float*hOutput = (float*)malloc(sizeof(float) * WIDTH);

for (int i = 0; i < WIDTH; i++) {
    hInput[i] = (float)i;
}

float* dInput = NULL, *dOutput = NULL;

size_t offset = 0;

texInput.addressMode[0] = cudaAddressModeBorder;
texInput.addressMode[1] = cudaAddressModeBorder;
texInput.filterMode = cudaFilterModePoint;
texInput.normalized = false;

checkCudaErrors(cudaMalloc((void**)&dInput, sizeof(float)*WIDTH));
checkCudaErrors(cudaMalloc((void**)&dOutput, sizeof(float)*WIDTH));

cudaMemcpy(dInput, hInput, sizeof(float)*WIDTH, cudaMemcpyHostToDevice);

cudaBindTexture(&offset, texInput, dInput, sizeof(float)*WIDTH);


copyKernel<<<1,1>>>(dOutput, WIDTH);

cudaMemcpy(hOutput, dOutput, sizeof(float)*WIDTH, cudaMemcpyDeviceToHost);
printf("\nInput = ");

for (int i = 0; i < WIDTH; i++) {
        printf("%f\t",hInput[i]);
    }
printf("\nOutput = ");
for (int i = 0; i < WIDTH; i++) {
    printf("%f\t",hOutput[i]);
}

return 0;
}
纹理输入;
__全局无效copyKernel(浮点*输出,整数n){
对于(int i=0;i
根据,当底层分配是CUDA数组时,使用
tex1D()。对于线性内存绑定纹理,正确的纹理功能是
tex1Dfetch()

对您的代码的修改(仅)使其适用于我:

$ cat t1139.cu
#include <stdio.h>
#include <helper_cuda.h>

texture<float, 1, cudaReadModeElementType> texInput;

__global__ void copyKernel(float*output, int n) {
for (int i = 0; i < n; i++) {
    output[i] = tex1Dfetch(texInput, i);
}
}

int main(int argc, char*argv[]) {

const int WIDTH = 8;

float* hInput = (float*)malloc(sizeof(float) * WIDTH);
float*hOutput = (float*)malloc(sizeof(float) * WIDTH);

for (int i = 0; i < WIDTH; i++) {
    hInput[i] = (float)i;
}

float* dInput = NULL, *dOutput = NULL;

size_t offset = 0;

texInput.addressMode[0] = cudaAddressModeBorder;
texInput.addressMode[1] = cudaAddressModeBorder;
texInput.filterMode = cudaFilterModePoint;
texInput.normalized = false;

checkCudaErrors(cudaMalloc((void**)&dInput, sizeof(float)*WIDTH));
checkCudaErrors(cudaMalloc((void**)&dOutput, sizeof(float)*WIDTH));

cudaMemcpy(dInput, hInput, sizeof(float)*WIDTH, cudaMemcpyHostToDevice);

cudaBindTexture(&offset, texInput, dInput, sizeof(float)*WIDTH);


copyKernel<<<1,1>>>(dOutput, WIDTH);

cudaMemcpy(hOutput, dOutput, sizeof(float)*WIDTH, cudaMemcpyDeviceToHost);
printf("\nInput = ");

for (int i = 0; i < WIDTH; i++) {
        printf("%f\t",hInput[i]);
    }
printf("\nOutput = ");
for (int i = 0; i < WIDTH; i++) {
    printf("%f\t",hOutput[i]);
}

return 0;
}
$ nvcc -I/usr/local/cuda/samples/common/inc t1139.cu -o t1139
$ cuda-memcheck ./t1139
========= CUDA-MEMCHECK

Input = 0.000000        1.000000        2.000000        3.000000        4.0000005.000000        6.000000        7.000000
Output = 0.000000       1.000000        2.000000        3.000000        4.0000005.000000        6.000000        7.000000        ========= ERROR SUMMARY: 0 errors
$
$cat t1139.cu
#包括
#包括
纹理输入;
__全局无效copyKernel(浮点*输出,整数n){
对于(int i=0;i
根据,当底层分配是CUDA数组时,使用
tex1D()。对于线性内存绑定纹理,正确的纹理功能是
tex1Dfetch()

对您的代码的修改(仅)使其适用于我:

$ cat t1139.cu
#include <stdio.h>
#include <helper_cuda.h>

texture<float, 1, cudaReadModeElementType> texInput;

__global__ void copyKernel(float*output, int n) {
for (int i = 0; i < n; i++) {
    output[i] = tex1Dfetch(texInput, i);
}
}

int main(int argc, char*argv[]) {

const int WIDTH = 8;

float* hInput = (float*)malloc(sizeof(float) * WIDTH);
float*hOutput = (float*)malloc(sizeof(float) * WIDTH);

for (int i = 0; i < WIDTH; i++) {
    hInput[i] = (float)i;
}

float* dInput = NULL, *dOutput = NULL;

size_t offset = 0;

texInput.addressMode[0] = cudaAddressModeBorder;
texInput.addressMode[1] = cudaAddressModeBorder;
texInput.filterMode = cudaFilterModePoint;
texInput.normalized = false;

checkCudaErrors(cudaMalloc((void**)&dInput, sizeof(float)*WIDTH));
checkCudaErrors(cudaMalloc((void**)&dOutput, sizeof(float)*WIDTH));

cudaMemcpy(dInput, hInput, sizeof(float)*WIDTH, cudaMemcpyHostToDevice);

cudaBindTexture(&offset, texInput, dInput, sizeof(float)*WIDTH);


copyKernel<<<1,1>>>(dOutput, WIDTH);

cudaMemcpy(hOutput, dOutput, sizeof(float)*WIDTH, cudaMemcpyDeviceToHost);
printf("\nInput = ");

for (int i = 0; i < WIDTH; i++) {
        printf("%f\t",hInput[i]);
    }
printf("\nOutput = ");
for (int i = 0; i < WIDTH; i++) {
    printf("%f\t",hOutput[i]);
}

return 0;
}
$ nvcc -I/usr/local/cuda/samples/common/inc t1139.cu -o t1139
$ cuda-memcheck ./t1139
========= CUDA-MEMCHECK

Input = 0.000000        1.000000        2.000000        3.000000        4.0000005.000000        6.000000        7.000000
Output = 0.000000       1.000000        2.000000        3.000000        4.0000005.000000        6.000000        7.000000        ========= ERROR SUMMARY: 0 errors
$
$cat t1139.cu
#包括
#包括
纹理输入;
__全局无效copyKernel(浮点*输出,整数n){
对于(int i=0;i