Command Prompt

Cullen

Command Prompt

Hi, I'm Cullen.

I'm a 4th year Computer Science undergrad at Stanford studying how computers work quickly, correctly, and efficiently. Below are some small projects I've worked on across different topics. Find me on LinkedIn or at cullenoc@stanford.edu.

NYC Traffic Collisions BigQuery

Matrix Multiplication OpenMP & AVX

VR Headset Audio Redesign

This Webpage

Notepad

In this data analysis project, fellow Stanford CS student Eastan Giebler and I queried datasets of all documented NYC motor vehicle collisions since 2012 (2 millions rows) and NYC Citibike station information (2,000 rows) with SQL in BigQuery. We identified the most dangerous factors (defective road shoulder, speeding, GPS) contributing to collisions and visualized trends in collision volume. The citibike station data was cleaned and merged with the collision data to find that the casualty rate (injury or fatality) of accidents increased from 21% to 26% in close proximity (250m) of Citibike stations. We trained a logistic regression model on relevant data features to predict whether a collision caused any casualties. Our model showed precision of 0.717 and accuracy of 0.833 when evaluated on our validation set.

The naive approach to Matrix Multiplication is an operation with plenty of independent work. The dot products of each row of some matrix A and each column of some matrix B can be computed independently of one another, and the products of each value in a row and each value of corresponding index in a column can also be computed independently. To build a working proficiency with a couple of parallel computing frameworks, I have exposed parallelism over rows and columns with OpenMP multithreading and parallelism over values within rows and columns with AVX intrinsics. Reprsenting a matrix as a one dimensional array introduces memory locality issues but these can largely by overcome by first transposing one of the matrices. Transposing matrix B allows for computing the dot product of each row of matrix A with each row of B, rather than each column of B. If the array representation of a matrix places a rows consecutive indexes in consecutive physical memory locations, then cache lines are read in and all values in the cache line are used in computation before another cache line is loaded. Reading a whole column, however, requires loading a cache line from one row, using a single value from that cache line in computation, and then loading a cache line from the next row, and so on.

Stanford's Surgery 172 gave me the opportunity to solve a design challenge involving human anatomy. My team incorporated bone-conduction headphones into a VR Headset Audio Redesign, reimagining a popular product to better acomodate user anatomy and needs. Bone-conduction Headphones offer greater comfort and spatial awareness that conventional headphones, making them desirable for sustained use and interactive environments. Simplicity and awarenes of material properties are at the core of our design (Slide 16 onwards, best viewed in Slideshow mode). Flexible struts similar to eyeglass temples, rather than sprung or otherwise adjustable joints, hold the bone conductor speakers to the skull. Forgoing additional joints reduces structual weak points and the need for adjustment when putting on the headset.

Seeking a challenge for my admittedly rudimentary web development skills, I decided to make a terminal visual to reflect my interest in low-level programming, which I typically do in a terminal editor. Here is the markup and code for this webpage, a mock up of a windows desktop and typing terminal. It features a class built around the typed.js library to continuously scroll the terminal window as new typing animations play. Being my first time using an external library in the front end, I got to wrangle with the difficulties of importing node modules and found an effective solution in the bundler Webpack.