summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan <[email protected]>2018-05-17 09:27:07 -0700
committerJonathan <[email protected]>2018-05-25 09:11:55 -0700
commit4fb2d23f350bd8921417f5c09bde73594e5c8a0b (patch)
tree2d4d121ad5465f8cecda0366bca9559c6c86531b
parenta9f90b837af13e205886c19696f779e15e2499b0 (diff)
allows gpgpusim to select a set of texture array,attr,info but maybe not the right one
-rw-r--r--src/abstract_hardware_model.h73
-rw-r--r--src/cuda-sim/cuda-sim.cc30
2 files changed, 94 insertions, 9 deletions
diff --git a/src/abstract_hardware_model.h b/src/abstract_hardware_model.h
index f5708bc..ca41e68 100644
--- a/src/abstract_hardware_model.h
+++ b/src/abstract_hardware_model.h
@@ -522,22 +522,77 @@ public:
}
const struct cudaArray* get_texarray( const struct textureReference *texref ) const
{
- std::map<const struct textureReference*,const struct cudaArray*>::const_iterator t=m_TextureRefToCudaArray.find(texref);
- assert(t != m_TextureRefToCudaArray.end());
- return t->second;
+
+ for (std::map<const struct textureReference*, const struct cudaArray*>::const_iterator kv = m_TextureRefToCudaArray.begin(); kv!= m_TextureRefToCudaArray.end(); kv ++){
+ const struct textureReference* tr = kv->first;
+ if (tr->normalized==texref->normalized&&
+ tr->filterMode==texref->filterMode&&
+ tr->addressMode[0]==texref->addressMode[0]&&
+ tr->addressMode[1]==texref->addressMode[1]&&
+ tr->addressMode[2]==texref->addressMode[2]&&
+ tr->channelDesc.x==texref->channelDesc.x&&
+ tr->channelDesc.y==texref->channelDesc.y&&
+ tr->channelDesc.z==texref->channelDesc.z&&
+ tr->channelDesc.w==texref->channelDesc.w&&
+ tr->channelDesc.f==texref->channelDesc.f){
+
+ return kv->second;
+ }
+ }
+
+ assert(false);
+// std::map<const struct textureReference*,const struct cudaArray*>::const_iterator t=m_TextureRefToCudaArray.find(texref);
+// assert(t != m_TextureRefToCudaArray.end());
+// return t->second;
}
const struct textureInfo* get_texinfo( const struct textureReference *texref ) const
{
- std::map<const struct textureReference*, const struct textureInfo*>::const_iterator t=m_TextureRefToTexureInfo.find(texref);
- assert(t != m_TextureRefToTexureInfo.end());
- return t->second;
+ for (std::map<const struct textureReference*, const struct textureInfo*>::const_iterator kv = m_TextureRefToTexureInfo.begin(); kv!= m_TextureRefToTexureInfo.end(); kv ++){
+ const struct textureReference* tr = kv->first;
+ if (tr->normalized==texref->normalized&&
+ tr->filterMode==texref->filterMode&&
+ tr->addressMode[0]==texref->addressMode[0]&&
+ tr->addressMode[1]==texref->addressMode[1]&&
+ tr->addressMode[2]==texref->addressMode[2]&&
+ tr->channelDesc.x==texref->channelDesc.x&&
+ tr->channelDesc.y==texref->channelDesc.y&&
+ tr->channelDesc.z==texref->channelDesc.z&&
+ tr->channelDesc.w==texref->channelDesc.w&&
+ tr->channelDesc.f==texref->channelDesc.f){
+
+ return kv->second;
+ }
+ }
+
+ assert(false);
+// std::map<const struct textureReference*, const struct textureInfo*>::const_iterator t=m_TextureRefToTexureInfo.find(texref);
+// assert(t != m_TextureRefToTexureInfo.end());
+// return t->second;
}
const struct textureReferenceAttr* get_texattr( const struct textureReference *texref ) const
{
- std::map<const struct textureReference*, const struct textureReferenceAttr*>::const_iterator t=m_TextureRefToAttribute.find(texref);
- assert(t != m_TextureRefToAttribute.end());
- return t->second;
+ for (std::map<const struct textureReference*, const struct textureReferenceAttr*>::const_iterator kv = m_TextureRefToAttribute.begin(); kv!= m_TextureRefToAttribute.end(); kv ++){
+ const struct textureReference* tr = kv->first;
+ if (tr->normalized==texref->normalized&&
+ tr->filterMode==texref->filterMode&&
+ tr->addressMode[0]==texref->addressMode[0]&&
+ tr->addressMode[1]==texref->addressMode[1]&&
+ tr->addressMode[2]==texref->addressMode[2]&&
+ tr->channelDesc.x==texref->channelDesc.x&&
+ tr->channelDesc.y==texref->channelDesc.y&&
+ tr->channelDesc.z==texref->channelDesc.z&&
+ tr->channelDesc.w==texref->channelDesc.w&&
+ tr->channelDesc.f==texref->channelDesc.f){
+
+ return kv->second;
+ }
+ }
+
+ assert(false);
+// std::map<const struct textureReference*, const struct textureReferenceAttr*>::const_iterator t=m_TextureRefToAttribute.find(texref);
+// assert(t != m_TextureRefToAttribute.end());
+// return t->second;
}
const gpgpu_functional_sim_config &get_config() const { return m_function_model_config; }
diff --git a/src/cuda-sim/cuda-sim.cc b/src/cuda-sim/cuda-sim.cc
index 946043a..6e04ca8 100644
--- a/src/cuda-sim/cuda-sim.cc
+++ b/src/cuda-sim/cuda-sim.cc
@@ -140,6 +140,36 @@ unsigned int intLOGB2( unsigned int v ) {
void gpgpu_t::gpgpu_ptx_sim_bindTextureToArray(const struct textureReference* texref, const struct cudaArray* array)
{
+ // counts number of matches
+// int normalized;
+// enum cudaTextureFilterMode filterMode;
+// enum cudaTextureAddressMode addressMode[3];
+// struct cudaChannelFormatDesc channelDesc;
+// int x;
+// int y;
+// int z;
+// int w;
+// enum cudaChannelFormatKind f;
+// int trMatches = 0;
+// for (auto& kv : m_NameToTextureRef){
+// const struct textureReference* tr = kv.second;
+// if (tr->normalized==texref->normalized&&
+// tr->filterMode==texref->filterMode&&
+// tr->addressMode[0]==texref->addressMode[0]&&
+// tr->addressMode[1]==texref->addressMode[1]&&
+// tr->addressMode[2]==texref->addressMode[2]&&
+// tr->channelDesc.x==texref->channelDesc.x&&
+// tr->channelDesc.y==texref->channelDesc.y&&
+// tr->channelDesc.z==texref->channelDesc.z&&
+// tr->channelDesc.w==texref->channelDesc.w&&
+// tr->channelDesc.f==texref->channelDesc.f){
+//
+// m_TextureRefToCudaArray[tr] = array;
+// trMatches++;
+// }
+// }
+// printf("GPGPU-Sim PTX: matches to texref = %d\n", trMatches);
+// assert(trMatches==1);
m_TextureRefToCudaArray[texref] = array;
unsigned int texel_size_bits = array->desc.w + array->desc.x + array->desc.y + array->desc.z;
unsigned int texel_size = texel_size_bits/8;