2016-11-30 144 views
1

如果我宣佈一個bindless紋理對象與tex1Dfetch和2D紋理

cudaResourceDesc resDesc; 
memset(&resDesc, 0, sizeof(resDesc)); 
resDesc.resType = cudaResourceTypeLinear; 
resDesc.res.linear.devPtr = device_global_memory_ptr; 
resDesc.res.linear.desc.f = cudaChannelFormatKindUnsigned; 
resDesc.res.linear.desc.x = 8 /* 8 bit */ ; 
resDesc.res.linear.desc.y = resDesc.res.linear.desc.x; 
resDesc.res.linear.desc.z = resDesc.res.linear.desc.x; 
resDesc.res.linear.desc.w = resDesc.res.linear.desc.x; 
resDesc.res.linear.sizeInBytes = buffer_bytes_size; 

cudaTextureDesc texDesc; 
memset(&texDesc, 0, sizeof(texDesc)); 
texDesc.readMode = cudaReadModeElementType; 
texDesc.filterMode = cudaFilterModePoint; 
texDesc.addressMode[0] = cudaAddressModeBorder; 
texDesc.addressMode[1] = cudaAddressModeBorder; 
texDesc.addressMode[2] = cudaAddressModeBorder; 

cudaTextureObject_t tex1; 
cudaCreateTextureObject(&tex1, &resDesc, &texDesc, NULL); 

,我以後使用它在CUDA內核

uchar4 pixel = tex1Dfetch<uchar4>(tex1, index); 

我仍然會得到一個2D紋理緩存的好處?或者緩存取決於tex1Dfetch指令?我不能得到上面的代碼與tex2D不幸地工作。

+1

我很確定答案是否定的。 「2D」緩存需要正確分配,紋理控制器已知寬度/間距。在這種情況下,我認爲你不能這樣做。 – talonmies

+0

@talonmies所以我應該用'cudaMallocArray'分配一個緩衝區,然後爲''cudaMemcpy(device2device)'分配一個緩衝區?我要試試這個,讓你知道 – Dean

+0

@talonmies工作。請讓它成爲答案,我會接受它。 – Dean

回答

1

不,我不會得到2D紋理緩存的好處。

,如果你只是用tex2D要麼它不會工作:我得到它的工作通過正確地分配數據與cudaMallocArray,然後使用tex2D