// Original CPU teaching model; not a device simulator or benchmark.
#include <iostream>
#include <vector>
#include <cstddef>
#include <stdexcept>

void require(bool ok) { if (!ok) throw std::runtime_error("model check failed"); }

int main() {
 std::vector<int> a(16),out(16,-1),writes(16,0);
 for(int i=0;i<16;++i) a[static_cast<std::size_t>(i)]=i;
 for(std::size_t base=0;base<16;base+=8) {
  std::vector<int> local(a.begin()+static_cast<std::ptrdiff_t>(base),a.begin()+static_cast<std::ptrdiff_t>(base+8));
  for(int& v:local) v+=10;
  for(std::size_t j=0;j<8;++j){out[base+j]=local[j];++writes[base+j];}
 }
 for(std::size_t i=0;i<16;++i) require(writes[i]==1 && out[i]==a[i]+10);
 std::cout<<"first="<<out.front()<<" last="<<out.back()<<" writes=16\n";
}

