39 #include "../thread/thread_load.cuh"
40 #include "../thread/thread_store.cuh"
41 #include "../util_device.cuh"
42 #include "../util_debug.cuh"
43 #include "../util_namespace.cuh"
45 #if (THRUST_VERSION >= 100700)
47 #include <thrust/iterator/iterator_facade.h>
48 #include <thrust/iterator/iterator_traits.h>
49 #endif // THRUST_VERSION
110 typename Offset = ptrdiff_t>
122 #if (THRUST_VERSION >= 100700)
124 typedef typename thrust::detail::iterator_facade_category<
125 thrust::device_system_tag,
126 thrust::random_access_traversal_tag,
132 #endif // THRUST_VERSION
137 typedef typename UnitWord<T>::TextureWord TextureWord;
141 TEXTURE_MULTIPLE =
sizeof(T) /
sizeof(TextureWord)
148 cudaTextureObject_t tex_obj;
164 size_t tex_offset = 0)
167 this->tex_offset = tex_offset;
169 cudaChannelFormatDesc channel_desc = cudaCreateChannelDesc<TextureWord>();
170 cudaResourceDesc res_desc;
171 cudaTextureDesc tex_desc;
172 memset(&res_desc, 0,
sizeof(cudaResourceDesc));
173 memset(&tex_desc, 0,
sizeof(cudaTextureDesc));
174 res_desc.resType = cudaResourceTypeLinear;
175 res_desc.res.linear.devPtr = ptr;
176 res_desc.res.linear.desc = channel_desc;
177 res_desc.res.linear.sizeInBytes = bytes;
178 tex_desc.readMode = cudaReadModeElementType;
179 return cudaCreateTextureObject(&tex_obj, &res_desc, &tex_desc, NULL);
185 return cudaDestroyTextureObject(tex_obj);
206 #if (CUB_PTX_ARCH == 0)
208 return ptr[tex_offset];
211 TextureWord words[TEXTURE_MULTIPLE];
214 for (
int i = 0; i < TEXTURE_MULTIPLE; ++i)
216 words[i] = tex1Dfetch<TextureWord>(
218 (tex_offset * TEXTURE_MULTIPLE) + i);
222 return *
reinterpret_cast<T*
>(words);
227 template <
typename Distance>
232 retval.tex_obj = tex_obj;
233 retval.tex_offset = tex_offset + n;
238 template <
typename Distance>
246 template <
typename Distance>
251 retval.tex_obj = tex_obj;
252 retval.tex_offset = tex_offset - n;
257 template <
typename Distance>
267 return tex_offset - other.tex_offset;
271 template <
typename Distance>
286 return ((ptr == rhs.ptr) && (tex_offset == rhs.tex_offset) && (tex_obj == rhs.tex_obj));
292 return ((ptr != rhs.ptr) || (tex_offset != rhs.tex_offset) || (tex_obj != rhs.tex_obj));