美文网首页
CUDA:VS2015不识别texture和tex1Dfetch

CUDA:VS2015不识别texture和tex1Dfetch

作者: SirBlanc | 来源:发表于2018-11-19 09:37 被阅读0次

    问题详细描述:在学习使用texture memory的时候,首先需要创建一个texture reference,然而在创建的时候vs2015却报错说“texture不是一个模板”

    我的解决方法:(win 64bits VS2015 CUDA 9.0)直接忽略它。vs的报错并没有影响工程的顺利编译,这个错误可能仅仅是vs对cuda语法的识别问题,就像对cuda中 “ <<< >>> ” 的不识别一样。

    详细说明:

    从CSDN和stackOverflow,以及nvidia forum上看到有几个朋友出现了同样的问题,但是没有人说过一个解决方法,所以现将我的解决方法记录下来,希望可以帮助到其他人。

    vs报错的截图

    第一处红色波浪线提示: texture不是一个模板; 第二处提示:tex1Dfetch是未定义标识符。如果我们点到texture,F12,发现texture的定义是包含在cuda_texture_types.h下的,具体的定义为 struct __device_builtin_texture_type__ texture : public textureReference。 而且前面还有一些预编译的语句,具体的原因我也不明白。

    完整测试代码如下:

    #include <iostream>

    #include <cuda.h>

    #include <cuda_runtime.h>

    #include <device_functions.h>

    #include <device_launch_parameters.h>

    #include "texture_fetch_functions.h"

    using namespace std;

    texture<float, 1, cudaReadModeElementType> textureReference;

    __global__ void kernel(float* doarray, int size)

    {

    int index;

    //calculate each thread global index

    index = blockIdx.x*blockDim.x + threadIdx.x;

    //fetch global memory through texture reference

    doarray[index] = tex1Dfetch(textureReference, index);

    printf("%f", doarray[index]);

    return;

    }

    int main(int argc, char** argv)

    {

    int size = 3200;

    float* harray;

    float* diarray;

    float* doarray;

    //allocate host and device memory

    harray = (float*)malloc(sizeof(float)*size);

    cudaMalloc((void**)&diarray, sizeof(float)*size);

    cudaMalloc((void**)&doarray, sizeof(float)*size);

    //initialize host array before usage

    for (int loop = 0; loop<size; loop++)

    harray[loop] = (float)rand() / (float)(RAND_MAX - 1);

    //copy array from host to device memory

    cudaMemcpy(diarray, harray, sizeof(float)*size, cudaMemcpyHostToDevice);

    //bind texture reference with linear memory

    cudaBindTexture(0, textureReference, diarray, sizeof(float)*size);

    //execute device kernel

    kernel << <(int)ceil((float)size / 64), 64 >> >(doarray, size);

    //unbind texture reference to free resource

    cudaUnbindTexture(textureReference);

    //copy result array from device to host memory

    cudaMemcpy(harray, doarray, sizeof(float)*size, cudaMemcpyDeviceToHost);

    //free host and device memory

    free(harray);

    cudaUnbindTexture(&textureReference);

    cudaFree(diarray);

    cudaFree(doarray);

    return 0;

    }

    相关文章

      网友评论

          本文标题:CUDA:VS2015不识别texture和tex1Dfetch

          本文链接:https://www.haomeiwen.com/subject/srcofqtx.html