text: On Wed, 16 Feb 2005, Vincent Diepeveen wrote: > It is possible for algorithms to have sequential properties, in short > making it hard to scale well. Game tree search happens to have a few of > such algorithms, from which one is performing superior with a number of > enhancements having the same property that a faster blocked get latency > speeds it up exponential. > > For the basic idea why there is an exponential speedup see Knuth and search > for the algorithm 'alfabeta'. > > So the assumption that an algorithm sucks because it doesn't need bandwidth > but latency is like sticking a hairpin in an electrical socket. > > If users would JUST need a little bit of bandwidth they already can get > quite far with $40 cards. > > So optimizing MPI for low latency small messages IMHO is very relevant. I sort of agree, but I think you miss my point. Or maybe we totally agree but I misunderstand. Some algorithms will, as you note, have sequential communications times associated with them that scale with the number of nodes. BOTH bandwidth AND/OR latency can be important in minimizing those and other times in the algorithms, and which one is important can even change during the course of the computation. If I have an algorithm where lots of small messages have to go to lots of places in some order, latency becomes important. If I have an algorithm where lots of BIG messages have to go lots of places in some order, bandwidth becomes important. There is plenty of room in between the extremes, order might or might not matter, resource contention might or might not be an issue, and there is plenty of opportunity for both big messages and small messages to be sent within a single application. Optimizing any particular MPI (or PVM) command for either extreme is then like robbing Peter to pay Paul, when Peter and Paul are a single bicephalic individual that has to pay protection money to the mob for every theft transaction (oh how I just LOVE to fold, spindle and mutilate metaphors). To illustrate some of the complexity issues and how interesting Life can be, consider the notion of a "broadcast". Node A wants to send the same message to N other nodes. Fine fine fine, happens all the time in certain kinds of parallel code. Node A therefore uses one of the collective operations (such as pvm_bcast or pvm_mcast in PVM, which is where I have more experience). Now, just what happens when this code is executed? PVM in this case promises that it will be a non-blocking send -- execution in the current thread on A resumes as soon as the "message is safely on its way to the receiving processors". It of course cannot promise that those processors will receive them, so "safely" is a matter of opinion. It also completely hides the details of how this >>difficult<< task is implemented, and whether or not it varies depending on the hardware or code context. To find out what it really does you must Use the (pvm) Source, Luke! and that is Not Easy because the actual thing it does is hidden beneath all sorts of lower level primitives. For example, the pvmd might send the message to each node in the receiving list one at a time, essentially serializing the entire message transmission (without blocking the caller, sure, but serial time is serial time). Or is it? If RDMA is used to deliver the message at the hardware device level so not even the pvmd is blocked for the full time of delivery, maybe not. Or, if the network device supports it, it might use an actual network broadcast or multicast. Then how efficiently it proceeds depends on whether and how broadcasts are supported by e.g. the kernel and intermediate network hubs. It could be anything from truly parallelized, so it takes a single latency hit to put the message on N lines (as an old ethernet repeater broadcast would probably do) to a de facto serialized latency (possibly with a much lower latency) hit as a store and forward switch stores and then forwards to each line in turn. If that's what they do these days -- it might even vary ethernet switch to switch. Myrinet, FC, SCI all might (and probably do) do >>different<< things when one tries to optimally implement a "broadcast". Or PVM might refuse to second guess the hardware at all. Instead it might use some sort of tree, and send the message (serially) to only some of the hosts in the receive list who both accept the message and forward the message to others so (perhaps) you send to four hosts, the first of these sends to 3 more while you finish, the second of these sends to two more while you finish, the third to one while you finish, and where each of THESE recipients find still more to send to so that you cover a lot more than four hosts in four latency hits (at the expense of involving all the intermediary systems heavily in delivery, which may or may not delay the threads running on those nodes depending very much on the HARDWARE. Which of these it SHOULD do very likely depends strongly -- very strongly -- on some arcane mix of the task itself and its organization and communications requirements, the PARTICULAR size of the object being sent THIS time, the networking hardware in use, the number of CPUs on the node and number of CPUs on the node that are running a task thread, and (often forgotten) the global communication pattern -- whether this particular transmission is a one-way master-slave sort of thing or just one piece of some sort of global message exchange where all the nodes in the group are going to be adding their own messages to this stream while avoiding collisions. The programmer sees none of this, so they think of none of this. They think "Gee, a broadcast. That's an easy way to send a message to many hosts with one send command. Great!" They think "this will cost just one latency hit to deliver the message to all N hosts because that's what "broadcast" >>means<< as they well know from watching TV and listening to the radio at the same time as a zillion other humans, in parallel. They may not (with PVM or MPI) even know what a "collision" or tree >>is<<, as there is no prior assumption of knowledge about physical networking or network algorithms in the learning or application of the toolsets. This is the Dark Side of APIs that hide detail and wrap it up in powerful black-box commands. They make the programming relatively easy, but they also keep you from coming to grips with all those little details upon which performance and sometimes even robustness or functionality depend. This is the "problem" I alluded to in the previous note. To really do the right thing for the user (presuming there IS such a thing as a universally right thing to do or even hoping to do the right thing nearly all the time) one either needs to write a large set of highly differentiated and differently optimized commands -- not just pvm_bcast, but pvm_bcast (presuming low latency hardware broadcast exists and is efficient), pvm_bcast_tree (presuming that NO efficient hardware broadcast exists and is efficient and possibly including additional arguments to spell out some things about the tree), pvm_bcast_tree_join (presuming that you need a tree and that each branch will both take something off a message passing through as a leaf and adding back a message to join the transmission to the next leaf as a root), pvm_bcast_rr (round robin broadcasts that are optimally synchronized for no collisions between "simultaneously" broadcasting hosts), and pvm_bcast_for_other_special_cases for the ones I've forgotten or don't know about, and maybe double or treble the entire stack or add flags to be optimal for latency dominated patterns, bandwidth dominated patterns, or somewhere in between. Alternatively, one can make just one pvm_bcast command, but put God's Own AI into it. Make smart decisions inside the hardware-aware daemons that automatically switch between all of the above and more, possibly dynamically during the course of a computation, to minimize delivery time and the load of all systems participating in the delivery. Hope that you do a good enough job of it that the result is still robust and doesn't constantly hang and crash when assumptions you built into it turned out to be incorrect or your "AI" turns out to be rather stupid. All of this is just the opposite from the problems you encounter if you program at the raw socket (or other hardware interface) level. There you have to work very hard to achieve the simplest of tasks -- open up a socket to a remote host, establish bidirectional ports, work out some sort of reliable message transmission sequence (which is nontrivial to do if you work with the lowest level and hence fastest networking commands, because communications is fundamentally asynchronous and unreliable and thus simple read/write commands do not suffice). However, once you get to where you CAN talk beween nodes with sockets, you are forced to confront the communication and computational topology questions and the various "special" capabilities of the hardware head on. No black boxes. You want a tree, you get a tree, but YOU have to program the tree and decide what to do if a leaf dies in mid-delivery, etc. You want to synchronize communications, you go right ahead but be prepared to figure out how to communicate synchronization information out of band. You want non-blocking communications, set the appropriate ioctl or fcntl, if you know how for your particular "file" or hardware. Learn the select call. Now things are totally controlled, but you have to be an experienced network programmer (a.k.a. a network programming God) to do anything complex. Sleep with Stevens underneath your pillow, that sort of thing. The big set, not just the single book version. And if you're THAT good, what are you doing working on a beowulf? There are big money jobs out there a-waitin', as there are for the other seventeen humans on the planet with that kind of ability...;-) What I think a lot of people (even experienced people) end up doing is using PVM or MPI to mask out the annoying parts of raw networking -- maintaining a list of hosts in the cluster, dealing with the repetitive parts of the network code that ensure reliable delivery, adding some nice management tools to pass out-of-band information around for e.g. process control and synchronization. Then they use a relatively small set of the available message passing commands, because they do not trust the more advanced black box collectives. Usually this lack of trust has a basis -- they tried them in some application or other and found that instead of speeding up, things got slower or had unexpected side effects, and they had no way of knowing what they actually DID, let alone how to fix them. They have no access to the real low level mechanism whereby those commands move data. That's what I meant about making MPI or PVM more "atomic". PVM has all sorts of pack and unpack commands for a message that permit (I suppose) typechecking and conversion to be done, where all I really want for most communications is a single send command that takes a memory address and a buffer length and a single receive command that takes a memory address and a (maximum) length. If I want to "pack" the buffer in some particular way, that's what bcopy is for. I don't want to "have" to allocate and free it every time I use it, or use a command that very likely allocates and frees a buffer I cannot see when I call it. The buffer might hold an int or int array, a double matrix, a struct, a vector of structs -- who cares? Pointers at both ends can unambiguously manage the typing and alignment -- I'm the programmer, and this is what I do. With this much simpler structure one can at least think about optimization as the problem is now much simpler. A message is a block of anonymous memory, period, with the programmer fully responsible for aligning the send address or receive address on both ends with whatever structure(s) or variable(s) are to be used there. It is very definitely less portable -- it leaves the user (or more likely a higher level command set built on top of the primitives) with the hassle of having to manage big-endian and little-endian issues as well as data size issues if they use the message passer across/between incompatible systems. These issues, however, were a lot more important in the past than they are today, and they add a bunch of easily avoided overhead to the vast majority of clusters where they aren't needed. With a simple set of building block such as this, one could then >>implement<< PVM or MPI or any other higher order, more portable message passing API on top of it. Indeed, I'd guess that this is very much what PVM really does (don't know about MPI) -- the pvm_pack routines very likely wrap up a malloc (of a struct), set metadata in struct, bcopy into data region of struct, send struct, free struct, with the inverse process on the other side driven/modified by the metadata (such as endianness) as needed. All sorts of tradeoffs of speed and total memory footprint in that sequence, many of which are not always necessary. One could ALSO focus more energy on the higher order/collective send routines, as one could write them INSIDE the low level constructs provided so they become USER level software instead of library black boxes. With sources, modifying or tuning them would no longer involve working with either raw sockets or a hidden set of internals for the library itself. I'm not sure I'm making myself clear on all of this, and for lots of programs I'm sure it doesn't matter, but for really bleeding edge parallel performance and complex code I suspect that raw sockets (or the equivalent device interface for non-IP-socketed devices) still hold a substantial edge over the same algorithms managed through same harddware with the message passing libraries. This was where I jumped in -- when Patrick made much the same statement. This (if true) is a shame, and is likely due to the assumptions that have gone into the implementation of the commands, some of which date back to big iron supercomputer days where the hardware was VERY DIFFERENT from today but ABSOLUTELY UNIFORM within a given hardware platform, so that "universal" tuning was indeed possible. Maybe it's time to reassess these assumptions. I am therefore trying to suggest that instead of "fixing" the collectives to work better for optimal latency at the expense of bw or vice versa (without even MENTIONING the wide array of hardware the same command is supposed to "transparently" achieve this miracle on) it might be better to work the other way -- add some very low level primitives that do little more than encapsulate and manage the annoying aspects of raw interfaces while still permitting their "direct" use. THEN implement PVM and MPI both on top of those low level primitives -- why not? The differences are all higher order interface things -- ultimately what they do is move buffers across buses and wires, although the process would be made a lot easier if there were a shared data structure and primitives to describe and perform common tasks on a "cluster" between them. A coder could then choose to "use a compiler" (metaphorically the encapsulated primitives) for some or all of their code and accept the default optimizations, or "use an assembler" (the primitives themselves) to hand-tune critical parts of their code, without having to leave the nice safe portable bounds of their preferred parallel library. If done really well, it would accomplish the long discussed merger of PVM and MPI almost as an afterthought with teeny tweaks (perhaps) of the commands, since they would be based on the same primitives and underlying data structures, after all. Just dreaming, I guess. Possibly hallucinating. That bump on the head, y'know. rgb -- Robert G. Brown http://www.phy.duke.edu/~rgb/ Duke University Dept. of Physics, Box 90305 Durham, N.C. 27708-0305 Phone: 1-919-660-2567 Fax: 919-660-2525 email:rgb at phy.duke.edu


text:
Find the perfect hotel in Brookside Village using our hotel guide provided below. Search for the cheapest discounted hotel and motel rates in or near Brookside Village, TX for your business or personal leisure travel. We show the best Brookside Village Texas hotel rooms. Review the Brookside Village hotel list below to find the perfect lodging. We also have a map of the Brookside Village hotels.
The Brookside Village center point is around 2 miles south of Minnetex and 4 miles southwest of Hobby.
How should we direct your call?

subset: commoncrawl


text:
Life in a Big CityKarachi is the biggest city in Pakistan and also one of the most thickly populated cities in the world. Its population has increased rapidly and accordingly has given rise to many social problems. People of this metropolis are becoming more and more concerned about solving these serious problems, some of which are discussed below.
The ever-increasing rush of heavy traffic on the roads is resulting in heavy loss of human life. One day or the other, people suffer form accidents due to reckless driving. Some lose their vehicles and some go to the police. This is due to lack of civic sense in the citizens and violation of traffic rules. Traffic jams, road quarrels, untidiness and damage of public property is also a result of this problem. The government has not done any planning to control this situation in the past two decades.
In the same manner, the government has never emphasized upon population distribution. As a result, slum areas are rapidly being built, where poor labour lives. The disordered development of small houses is spoiling the outlook of the city, as well as creating problems of illegal electric connections, water supply and pollution. The authorities have failed to reclaim the locations from these people.
The academic career of children in Karachi is unpredictable due to lack of good schools and institutions. The need of recreational institutions, parks and play grounds is also felt at times and most of all joblessness creates problems for poor people.
Another problem faced by the citizens of the city is the frequent power breakdowns. Every other day, K.E.S.C cuts down the electric supply without notice. This becomes a great hurdle for industries and professional that use electric machinery for their work. Disturbance and shortage of water supply is also a cause of discomfort among the citizens. Sometimes, the dirty and unfiltered water becomes a major factor in food poisoning, which usually takes place on festive occasions, when demand of water in the city increases. Any measure to improve the supply of filtered water has also not been adopted by the government. Problems due to improper drainage system are also becoming a matter of concern among the people. The alarming in crease in the disorderliness of drainage lines is posing serious threats for people, especially in poor areas. Filth and dirt runs down a channel by the footpath and children play over it. We have malaria, cholera and dysentery still destroying our children because such things exist.
The attitude of beggars in Karachi is the most irritating problem. They are worthless idlers robbing good-natural people. It has become their regular practice to crowd public spots and cheat people. The adverse effects of begging problem are noticeable in sum areas.
There are too many dirty and ownerless dogs roaming about in the streets of Karachi. They spread many diseases and sometime become a danger by injuring people.
Lack of environmental care among people and drivers of public service vehicles is giving rise to pollution problems. Dust fills the air in most of the roads all the time. Improper turned cars fill the atmosphere with deadly smoke at hours of rush, which causes disease among the policemen and common public. The blowing of pressure horns is always there, deafening the ears.
Karachi is also often subjected to terrorist activities. Bomb blasts and firings at public spots are resulting in great loss of human life. The terrorists deserve no less than capital punishment. It is the duty of the police to intensify their investigation to stop such activities.
For the well to do class, life in Karachi may be fascinating, but for other citizens it is a center of drawbacks. It is only through the concentrated efforts of each and every person, including the members of law-enforcing and administrative agencies, can we overcome these serious problems of the metropolis.


text:
Main Menu
If you are not satisfied with your Steam Controller or Steam Link purchase, you can pursue a refund or request a replacement by initiating the RMA process. If you need help with a replacement part or a purchased accessory, go here for replacement, return or support options.
If your product is defective, please follow the steps below to see if your unit needs to be replaced:
If this tree determines that your unit has experienced a hardware failure or unrecoverable firmware error, you can request a replacement device.
Once initiated, you will receive an automatically generated, pre-paid shipping label along with further shipping instructions. When your unit is returned to our facility and scanned, you will automatically be shipped a new replacement device.
Please follow the same steps as above to determine if your unit requires a replacement.
*Please note that Canadian purchases of Steam Hardware are handled by EB Games and Amazon only. You will need to contact the retailer for any available refund or exchange options.*
Replacement parts/accessories for Steam Hardware are now available through the Steam Store. Need something else? Feel free to contact contact Steam Support.
If you are not satisfied with your purchase and would like to return the product, you may request a refund through the help site. We will provide a shipping label to cover return shipping costs. To qualify for a refund, your request must be submitted within 30 days of receiving the product. If you are experiencing technical issues with your Controller, we recommend contacting Steam Support before requesting a refund.
To request a refund for your device, please follow the instructions below:
If you have purchased this product from a retailer other than Steam, you will need to pursue a refund with your retailer.


text:
Wolfteam Hack Tool Download
A 3D online game, Wolfteam, is one of the best ever online shooting games. Get the choice of switching between marine (first person) and wolf (third person) at just a click of a button. Fact paced and balanced, the game is bound to give you an adrenaline rush, a must play for every action lover!
The game can be played free of cost lest the extra expenses incurred for acquiring the in-game currency. Many players are forced to spend the real world currency for acquiring the in-game currency in order to survive in the game. However, this is not the only way out! There are numerous Wolfteam Hacks and cheats available online that provide unlimited benefits to the players. However, you need to be cautious as all hacks and cheat codes are not reliable and authentic.
If you are looking out for reliable and ethical hack and cheat codes, then our Wolfteam hack Tool is the end of your search. Our hack and cheat codes have been developed after years of research and provide support to the players throughout the course of the game. Our Wolfteam hack cheats codes are 100% crash proof and do not fail anytime while using them during the game.
Some of the incredible features of our Wolfteam hack Tool are listed below:
Our Wolfteam cheats have been designed keeping the needs of the online gamers in mind and aim at elevating the complete gaming experience.
No need to manually update your hack and cheat codes now, as our Wolfteam hack codes are built in with the amazing auto-update feature, which automatically updates the hack as soon as any new update is available.
Is the fear of banned identity holding your back from using the hack and cheat codes? Not anymore, as ourWolfteam hack Tool comes with the in-built anti-ban feature and this protects your identity from getting banned while using the hack.
Whether you use Windows, Linux, or Mac as your operating system configuration, our Wolfteam hack codes work effortlessly on all of them.
Gold is the game currency that is very important to achieve success in the game. With our hack you can now create infinite amount of Gold free of cost.
Use the Aimbot feature of our hack to enhance your shooting skills.
The level hack feature will help in reaching new levels swiftly.
With the immortality feature your health meter is never going to diminish as this feature will freeze your health meter.
No matter which browsing setup you are using (Explorer, Chrome, or Firefox) our Wolfteam hack codes are compatible with all of them.
So, download our Wolfteam hack Tool codes today by visiting free-hack.eu and be a Pro in this game!
Download Wolfteam Hack Tool
Click This Button To See How To Download
Click This Button To Start Download From Server 2


text:
15"x11" Mixed Media on Paper/Available
Click HERE for more info.
Visit http://www.joanfullerton.com to view more of my work.
Visit http://www.joanfullertonworkshops.com to view my upcoming workshops.
Study With Me in Italy!!
Cinque Terra and Tuscany
October 4th-14th 2017
Find your inspiration expanded as you experience the rich warm color of Tuscany.
All of your senses will be awakened and time will slow down as you savor the moments!
Click HERE to Read more about this wonderful opportunity!


text:
Actor Cary Elwes has put his Malibu house on the market at $1.975 million.
The Old World-style Mediterranean, built in 1978, looks out on the ocean and surrounding hillsides. The 2,700-plus-square-foot home sits behind walls on about an acre. Features include a red-tiled portico, interior archways, expansive windows, a deck, three bedrooms and three bathrooms.
Elwes, 49, has appeared on the series "Psych" (2009-10), "Law & Order: Special Victims Unit" (2007) and "The X-Files" (2001-02). He will star in the upcoming films "The Story of Luke" and "The Oogieloves in the Big Balloon Adventure." His starring-role credits include "Saw" (2004), "Twister" (1996) and "The Princess Bride" (1987).
Public records show Elwes bought the property in 1996 for $615,000.
Eytan Levin of the Levin Group is the listing agent.


text:
Available in Petite & Tall
Crop Slim-Leg Pant - Signature - 7th Avenue
$42.95 $25.00 42% Off
42% Off
Slim Leg Crop Pant - Button Waistband - Modern Fit - 7th Avenue
$42.95 $29.00 32% Off
32% Off
Button-Front Slim Pant - 7th Avenue
$69.95 $35.00 50% Off
50% Off
Lace-Up Ankle Pant - City Stretch Linen Flex - 7th Avenue
Buy 1 Get 1 50% Off
Plaid Ankle Pant - Modern Fit - 7th Avenue
Buy 1 Get 1 50% Off
Available in Petite & Tall
$49.95 $25.00 - $39.00 Up to 50% Off
Up to 50% Off
Available in Petite & Tall
Straight Leg Pant - Signature Fit - All-Season Stretch - 7th Avenue
$54.95 $27.47 - $54.95
Buy 1 Get 1 50% Off
Available in Petite & Tall
Straight Leg Pant - Signature Fit - City Stretch Linen Flex - 7th Avenue
Buy 1 Get 1 50% Off
Say goodbye to the stress of pant shopping. Stop the never-ending hunt for the perfect denim wash. We've got all the cuts, colors and washes your closet is craving. From retro-perfect flares to polished, tailored pairs, our selection of yellow 4 pants makes finding your dream fit a breeze.
- Loving Leggings. Say hello to legs for days. Classic, laid-back and always chic, our leggings flatter you from hip to toe. And, with stylish details like flirty crochet trims, sexy distressing and daring washes, they're the perfect way to complete any look.
- Great Lengths. Being tall has a lot of perks, but a downside
is was not always finding the right length when it comes to clothes. Our tall pants are available in all your favorite colors and styles, covering your show-off worthy legs without compromise.
- Petite Perfection. We predict a lot fewer trips to the tailor in your future. Our petite pants are available in nearly all of our most popular styles and washes. We we have the perfect fit at the perfect length for you for work, for play, for every day.
- Working It. Get ready to make a statement in your office. Our collection of dress pants is made up of three classic styles designed to flatter you in all the right places. Available in a host of have-to-have colors and prints, getting dressed in the AM is sure to be a lot more fun.
- Crop to it. If there was an official pant of warm weather, the crop would be it. Easily your new go-to pair thanks to the colors, the prints and sleek details like silver tone hardware and textured fabrics. It's the perfect way to hit refresh on your summer style.
Go ahead: complete your look. Shop more styles from New York & Company today.


text:
I stopped to talk to her. She told me that the shelters were full, that she was trying to raise enough money to get a hostel room. I've heard this story before—there are not nearly enough shelter spaces here. As she talked, I looked at the sores on her face, her stringy hair, her bad teeth, trying to judge how old she was. It was impossible; she had an old-before-her-time face that spoke of a hard life. She might have been in her early 20s or she might have been in her late 30s.
She told me that she was cold and hungry, that I was the first person to stop for her in two days. And then she broke my heart. "I'm pregnant," she said, moving the blanket and showing me the outline of her belly.
We talked about the book she was reading—it was one her mom had loved—and about other authors she liked. She told me that she was seven months pregnant, and she smiled and ran her hand over her belly just like any mom-to-be in the suburbs would do. I have no idea what she's been through in her life. Her current circumstances are vastly different from mine. But, like me, she's somebody's daughter. And she's going to be somebody's mother.
By the time I came back to Waterfront Station on my way home eight hours later, it had started to rain and the woman was gone. In the two days since then, the rain has not stopped. The stormy November winds have kicked up. This is not a pleasant time of year in Vancouver. The dampness seeps right through to your bones and the cold wind hurts.
I've been stopping during the day and waking up in the middle of the night, wondering where she is. Where will she go once her baby's been born? How will they cope?
Last month, I spent most of Thanksgiving week volunteering downtown with Gratitude Week to End Homelessness, an organization raising money to restore two residency hotels on the Downtown Eastside. I had the good fortune to be assigned to the Gratitude Wall, where we invited passersby to make signs celebrating something they were grateful for. And they did, even in the wind and pouring rain—over 600 of them.
I talked to more people in those few days than I usually do in a month: business people, homeless people, whole field trips of school kids, tourists who were shocked to see people sleeping on the sidewalks in such a beautiful city. I talked to a guy with a huge smile that showed the single tooth clinging to his bottom gum. A woman on welfare dug her last 26 cents out of her pocket to put into the collection bucket, proud to have something to give. A man who has struggled with mental illness was grateful that his wife had proposed to him.
One homeless guy gave us a dollar. He said that it was an investment in his own future. If he gave a dollar now, it might mean that he would have a place to stay someday.
A man who used to be homeless made this sign:
He told me he had been lost for a few years but that he now had a home and a good life.
A developmentally disabled man and I had a long talk about the need to help hungry children right here in Vancouver. He was also grateful for everything:
An old guy with a smile that lit up his wizened face stopped at my table to see what it was about. He lives in a residency hotel and spends his days walking downtown. He was full of stories of the hotel and the streets—stories, he said, that no one was interested in hearing. Well, I was, so he came back on another day and hung out with me again. He had come to the Gratitude Week site to sit in the heated tent where speakers gave lunchtime talks about mental health issues. He wasn't there to listen so much as to sit. He wondered why nobody set up tents like that for the homeless on cold winter days. A chair, a roof, a heater: "That must be what heaven is like," he said.
On my way home from the site one day, I went into the mall. As my fingers and nose started to thaw out, I was aware of the fact that because I have clean clothes, a place to shower every day, and some money in my pocket, I was welcome to come inside to warm up and use the washroom. Later, when I stopped in at our neighbourhood grocery store, I saw a sign on the community bulletin board advertising a Botox party—get rid of your wrinkles with your friends in the comfort of your own home! I wondered how two such different worlds could exist at the same time, so close together.
So here I sit in my chair, with a solid roof over my head and a furnace pumping heat through the vents, wondering and worrying about that pregnant woman and the thousands of other people who might be out in the rain today, unwelcome in the warm places. In the world I live in every day, we complain about what we don't have, about our wrinkles or our slightly out-of-date electronics or our couches that are not quite the right colour. But to many people in that other world, this just might be what heaven is like.