问题详细描述:在学习使用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;
}
网友评论