Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California,...

56
Glift: Generic, Efficient Glift: Generic, Efficient Random-Access GPU Data Random-Access GPU Data Structures Structures Aaron Lefohn Aaron Lefohn University of California, Davis University of California, Davis

Transcript of Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California,...

Page 1: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

Glift: Generic, EfficientGlift: Generic, EfficientRandom-Access GPU Data Random-Access GPU Data

StructuresStructures

Aaron LefohnAaron Lefohn

University of California, DavisUniversity of California, Davis

Page 2: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

2

CollaboratorsCollaborators

• Joe KnissUniversity of Utah

• Robert StrzodkaStanford University

• Shubhabrata SenguptaUniversity of California, Davis

• John OwensUniversity of California, Davis

Page 3: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

3

Problem StatementProblem Statement• Goal

– Simplify creation and use of random-access GPU data structures for graphics and GPGPU programming

• Contributions– Abstraction for GPU data structures– Glift template library

Page 4: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

4

Compute vs. Bandwidth : 2005 Compute vs. Bandwidth : 2005 UpdateUpdate• Float4 perfect cache hit

GFLOPS

GFloats/sec

15x Gap

10x Gap

Based on data from http://graphics.stanford.edu/projects/gpubench/results/

Page 5: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

5

Compute vs. Bandwidth : 2005 Compute vs. Bandwidth : 2005 UpdateUpdate• Float4 sequential (streaming) read

GFLOPS

GFloats/sec

37x Gap

22x Gap

Based on data from http://graphics.stanford.edu/projects/gpubench/results/

Page 6: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

6

CPU Software DevelopmentCPU Software Development

• Benefits• Algorithms and data structures expressed in problem

domain• Decouple algorithms and data structures• Code reuse

Motivation

Application

Data Structure Library

CPU Memory

Algorithm Library

Page 7: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

7

GPU Software DevelopmentGPU Software Development

• Problems• Code is tangled mess of algorithm and data structure

access• Algorithms expressed in GPU memory domain• No code reuse

Application- Data structure and algorithm

GPU Memory

Motivation

Page 8: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

8

GPU Data Structure AbstractionGPU Data Structure Abstraction

• What’s Missing?– Standalone abstraction for GPU data structures

for graphics or GPGPU programming

Motivation

Brook

C++ Cg OpenGL

STL ???

Sh

Page 9: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

9

typedef boost::multi_array<float, 3> array_type; array_type srcData( boost::extents[10][10][10] ); array_type dstData( boost::extents[10][10][10] );

… initialize data …

for (size_t z = 1; z < 10; ++z) {for (size_t y = 1; z < 10; ++y) { for (size_t x = 1; z < 10; ++x) { dstData[z][y][x] = srcData[z–1][y–1][x–1]; }

} }

CPU (C++) ExampleCPU (C++) ExampleAbstraction

Page 10: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

10

float3 getAddr3D( float2 winPos, float2 winSize, float3 sizeConst3D ) { float3 curAddr3D; float2 winPosInt = floor(winPos); float addr1D = winPosInt.y * winSize.x + winPosInt.x; addr3D.z = floor( addr1D / sizeConst3D.z ); addr1D -= addr3D.z * sizeConst3D.z; addr3D.y = floor( addr1D / sizeConst3D.y ); addr3D.x = addr1D - addr3D.y * sizeConst3D.y; return addr3D;}

float2 getAddr2D( float3 addr3D, float2 winSize, float3 sizeConst3D ) { float addr1D = dot( addr3D, sizeConst3D ); float normAddr1D = addr1D / winSize.x; return float2(frac(normAddr1D) * winSize.x, normAddr1D);}

float3 main( uniform samplerRECT data, uniform float2 winSize,

uniform float3 sizeConst3D, float2 winPos : WPOS ) : COLOR

{float3 hereAddr3D = getAddr3D( winPos, winSize, sizeConst3D );float3 neighborAddr = hereAddr3D - float3(1, 1, 1);return texRECT(data, getAddr2D(neighborAddr3D, winSize,

sizeConst3D) );}

We Want To Transform This…We Want To Transform This…Abstraction

Page 11: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

11

Into This.Into This.

void main( uniform VMem3D data,

AddrIter3D iter,

out float result )

{

float3 va = iter.addr();

return srcData.vTex3D( va – float3(1,1,1) );

}

Abstraction

Page 12: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

12

OverviewOverview

• Motivation• Abstraction• Glift template library• Conclusions

Page 13: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

13

Building the AbstractionBuilding the Abstraction

• Goals– Enable easy creation of new structures – Minimal efficient abstraction of GPU memory

model– Separate data structures from algorithms– Clarify characteristics of GPU-compatible

structures– Encourage efficiency

Abstraction

Page 14: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

14

Building the AbstractionBuilding the Abstraction

• Approach– Bottom-up, working towards STL-like syntax– Identify common patterns in GPU papers and

code– Inspired by

• STL, Boost, STAPL, A. Stepanov• Brook

Page 15: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

15

Previous GPU Data Structure Previous GPU Data Structure AbstractionsAbstractions• Brook

– Virtualizes CPU/GPU interface for 1D – 4D arrays

• Sh– Virtualizes 1D arrays and CPU/GPU data access

Previous Work

Page 16: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

16

What is the GPU Memory Model?What is the GPU Memory Model?

• CPU interface• glTexImage malloc• glDeleteTextures free• glTexSubImage memcpy GPU -> CPU• glGetTexSubImage* memcpy CPU -> GPU• glCopyTexSubImage memcpy GPU -> GPU• glBindTexture read-only parameter bind• glFramebufferTexture write-only parameter bind

* Does not exist. Emulate with glReadPixels

Abstraction

Page 17: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

17

What is the GPU Memory Model?What is the GPU Memory Model?

• GPU Interface (shown in Cg)

• uniform samplerND parameter declaration• texND(tex, addr) random-access read• streamND(tex)* stream read

* Does not exist, but is a useful construct for efficiency reasons

Abstraction

Page 18: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

18

GPU Data Structure AbstractionGPU Data Structure Abstraction

• Concepts– Physical memory– Virtual memory– Address translator– Iterators

• Address iterators• Element iterators

Abstraction

Page 19: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

19

Physical MemoryPhysical Memory

• Native GPU textures– Choose based on algorithm efficiency

requirements• 1D

– Read-write, linear, 4096 max size

• 2D– Read-write, bilinear, 40962 max size

• 3D– Read-only, trilinear, 5123 max size

• Cube– read-write, bilinear, square, array of six 2D textures

• Mipmaps– Additional (multiresolution) dimension to address

Abstraction

Page 20: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

20

Virtual MemoryVirtual Memory

• Virtual N-D address space– Choose based on problem space of algorithm– Defined by physical memory and address

translator

Abstraction

Virtual representation of memory: 3D grid

Translation

3D native mem

Translation

2D slices

Translation

Flat 3D texture

Page 21: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

21

Address TranslatorAddress Translator

• Mapping between physical and virtual addrs

– Core of data structure– Select based on virtual and physical domains

and memory/compute efficiency requirements of algorithm

– Small amount of code defines all required CPU and GPU memory interfaces

Abstraction

PhysicalAddress

VirtualAddress

Page 22: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

22

Address TranslatorAddress Translator

• Core of data structure– Extension point for creating new structures– Must define

translate(…)translate_range(…)cpu_range(…)gpu_range(…)

Implementation

Page 23: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

23

Address Translator ExamplesAddress Translator Examples

• Examples– ND-to-2D– 3D-to-2D tiled “flat 3D textures” – Page table– Grid of lists– Hash table– Silmap

Abstraction

Page 24: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

24

Address Translator Address Translator ClassificationsClassifications• Representation

– Analytic / Discrete

• Memory Complexity– O(1), O(log N), O(N), …

• Compute Complexity– O(1), O(log N), O(N), …

Abstraction

• Compute Consistency– Uniform vs. non-uniform

• Total / Partial– Complete vs. sparse

• One-to-one / Many-to-one– Uniform vs. adaptive

Page 25: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

25

IteratorsIterators

• Separate algorithms and data structures– Minimal interface between data and algorithm– Algorithms traverses elements of generic structures– Required for GPGPU use of data structure

• Two types of iterators– Address iterators

• Iterator value is N-D address• GPU interpolants (Brook iterator streams)

– Element iterators• Iterator value is data structure element• C/C++ pointer, STL iterator, Brook streams

Abstraction

Page 26: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

26

Which Element Iterators?Which Element Iterators?

• Type of iterator defines– Permission

•Read-only, write-only, read-write

– Access region• Single, neighborhood, random

– Traversal• Forward, backward, parallel range

Abstraction

Page 27: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

27

Which Element Iterators?Which Element Iterators?

• Read-only, single access, range iterator– GPU stream input (Brook input stream)

• Read-only, random-access, range iterator– GPU texture input (Brook arrays)

• Write-only, single access, range iterator– GPU render target (Brook output stream)

Abstraction

Page 28: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

28

Element IteratorsElement Iterators

• CPU and GPU iterators– Wider range of CPU iterator types (less

restricted)– GPU iterators define GPGPU computation

domain– Possibly more GPU iterator types as machine

model evolves…

Page 29: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

29

• CPU (C++) 3D array

typedef boost::multi_array<float, 3> array_type; array_type srcData( boost::extents[10][10][10] ); array_type dstData( boost::extents[10][10][10] );

… initialize data …

for (size_t z = 1; z < 10; ++z) {for (size_t y = 1; z < 10; ++y) { for (size_t x = 1; z < 10; ++x) { dstData[z][y][x] = srcData[z–1][y–1][x–1]; }

} }

Simple ExampleSimple ExampleAbstraction

Page 30: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

30

float3 getAddr3D( float2 winPos, float2 winSize, float3 sizeConst3D ) { float3 curAddr3D; float2 winPosInt = floor(winPos); float addr1D = winPosInt.y * winSize.x + winPosInt.x; addr3D.z = floor( addr1D / sizeConst3D.z ); addr1D -= addr3D.z * sizeConst3D.z; addr3D.y = floor( addr1D / sizeConst3D.y ); addr3D.x = addr1D - addr3D.y * sizeConst3D.y; return addr3D;}

float2 getAddr2D( float3 addr3D, float2 winSize, float3 sizeConst3D ) { float addr1D = dot( addr3D, sizeConst3D ); float normAddr1D = addr1D / winSize.x; return float2(frac(normAddr1D) * winSize.x, normAddr1D);}

float3 main( uniform samplerRECT data, uniform float2 winSize,

uniform float3 sizeConst3D, float2 winPos : WPOS ) : COLOR

{float3 hereAddr3D = getAddr3D( winPos, winSize, sizeConst3D );float3 neighborAddr = hereAddr3D - float3(1, 1, 1);return texRECT(data, getAddr2D(neighborAddr3D, winSize,

sizeConst3D) );}

Example : GPU Shader Example : GPU Shader FactorizationFactorization

Abstraction

Physical-to-Virtual Physical-to-Virtual Address TranslationAddress Translation

Virtual-to-PhysicalVirtual-to-PhysicalAddress TranslationAddress Translation

Physical Memory Physical Memory ReadRead

Page 31: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

31

float3 getAddr3D( float2 winPos, float2 winSize, float3 sizeConst3D ) { float3 curAddr3D; float2 winPosInt = floor(winPos); float addr1D = winPosInt.y * winSize.x + winPosInt.x; addr3D.z = floor( addr1D / sizeConst3D.z ); addr1D -= addr3D.z * sizeConst3D.z; addr3D.y = floor( addr1D / sizeConst3D.y ); addr3D.x = addr1D - addr3D.y * sizeConst3D.y; return addr3D;}

float2 getAddr2D( float3 addr3D, float2 winSize, float3 sizeConst3D ) { float addr1D = dot( addr3D, sizeConst3D ); float normAddr1D = addr1D / winSize.x; return float2(frac(normAddr1D) * winSize.x, normAddr1D);}

float3 main( uniform samplerRECT data, uniform float2 winSize,

uniform float3 sizeConst3D, float2 winPos : WPOS ) : COLOR

{float3 hereAddr3D = getAddr3D( winPos, winSize, sizeConst3D );float3 neighborAddr = hereAddr3D - float3(1, 1, 1);return texRECT(data, getAddr2D(neighborAddr3D, winSize,

sizeConst3D) );}

Example : Glift ComponentsExample : Glift ComponentsAbstraction

Address IteratorAddress Iterator

Address TranslaterAddress Translater

Virtual MemoryVirtual Memory

Page 32: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

32

Example : GPU Shader with GliftExample : GPU Shader with Glift

Cg Usage

void main( uniform VMem3D data,

AddrIter3D iter ) : COLOR

{

float3 va = iter.addr();

return srcData.vTex3D( va – float3(1,1,1) );

}

Abstraction

Page 33: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

33

Example : GPU C++ Code with Example : GPU C++ Code with GliftGlift

C++ Usagevec3i origin(0,0,0); vec3i size(10,10,10);

ArrayGpuND<vec3i,vec1f> srcData( size ); ArrayGpuND<vec3i,vec1f> dstData( size );

… initialize dataPtr …srcData.write( origin, size, dataPtr );

gpu_range_iterator it = dstData.gpu_range(origin, size);

it.bind_for_read( iterCgParam );

srcData.bind_for_read( srcCgParam );dstData.bind_for_write( COLOR0,

myFrameBufferObject );

mapGpu( it );

Abstraction

Page 34: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

34

Additional Benefits of Additional Benefits of AbstractionAbstraction• Multiple PhysMem with same

AddrTrans– “Unlimited” amount of data in structures

• Multiple AddrTrans with one PhysMem– “reinterpret_cast” physical memory

• Continuguous memory layout– Efficient stream processing of PhysMem or

AddrTrans

Abstraction

Page 35: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

35

OverviewOverview

• Motivation • Abstraction• Glift template library• Conclusions

Page 36: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

36

Glift ComponentsGlift Components

Application

PhysMem AddrTrans

C++ / Cg / OpenGL

VirtMem

Container Adaptors

Implementation

Page 37: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

37

Glift Design GoalsGlift Design Goals

• Generic implementation of abstraction

• As efficient as hand-coding• Unified C++ and Cg code base

• Easily extensible• Incrementally adoptable• Easy integration with Cg/OpenGL

Implementation

Page 38: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

38

C++/Cg IntegrationC++/Cg Integration

• Each component defines C++ and Cg code– C++ objects have Cg struct representation– Stringified Cg parameterized by C++

templates

• Cg “template” instantiation– Insert generated Glift source code into shader– glift::cgInstantiateParameter

• All other compilation/loading/binding identical to standard shader

Implementation

Page 39: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

39

More Glift Examples….More Glift Examples….

• 4D array• 3D sparse array

– Sparse array implemented with a page table

• Stack

Page 40: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

40

4D Array Declaration Example4D Array Declaration Example

• Build 4D array of vec3f values

typedef PhysMemGPU<vec2i, vec3f> PMem2D;typedef NdTo2DAddrTrans<vec4i,vec2i> Addr4to2;typedef VirtMemGPU<Addr4to2, PMem2D> VMem4D;

vec4i virtSize( 10, 10, 10, 10);vec2i physSize( 100, 100 );

PMem2D pMem2D( physSize );Addr4to2 addrTrans( virtSize, physSizse );VMem4D array4D( addrTrans, pMem2D );

Page 41: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

41

4D Array Usage Example4D Array Usage Example

• Interface similar to native texturevec3f* data = … initialize data …vec4i origin(0,0,0,0);

array4D.write( origin, virtSizse, data );…array4D.bind_for_read( cgParam );…array4D.bind_for_write( GL_COLOR_ATTACHMENT0 );…array4D.read( origin, virtSize, data );…

Page 42: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

42

4D Array Shader Example4D Array Shader Example

• Interface similar to native texture

float4 main( uniform VMem4D array4D, float4 addr ) : COLOR

{ return 2.0f * array4D.vTex4D( addr );

}

Page 43: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

43

Sparse 3D Array Declaration Sparse 3D Array Declaration ExampleExample• Build sparse 3D grid of vec4ub

values

typedef VirtPageTable<vec3i, vec3f, vec4ub, page_allocator>

VMem3D;

vec3i virtSize(512, 512, 512);vec3i physSize(128, 128, 128);

VMem3D sparse3D( virtSize, physSize );

Page 44: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

44

Sparse 3D Array Usage ExampleSparse 3D Array Usage Example

• Interface similar to native texturevec4ub* data = … initialize data …vec3i origin(0,0,0);vec3i size(20,20,20);

sparse3D.write( origin, virtSize, data );…sparse3D.bind_for_read( cgParam );…sparse3D.bind_for_write( GL_COLOR_ATTACHMENT0 );…sparse3D.read( origin, size, data );…gpu_range_iterator it = sparse3D.gpu_range(origin,

size);

Page 45: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

45

Sparse 3D Array Shader Sparse 3D Array Shader ExampleExample• Element iterator interface (GPGPU)

float4 main( ElementIter3D sparse3D ) : COLOR{

return sparse3D.value() / 2.0f;}

Page 46: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

46

GPU Stack ExampleGPU Stack Example

• Build stack of vec4ub values– Container adaptor atop 1D virtual array

int maxSize = 10000;glift::stack<vec4ub> gpuStack(maxSize);

glift::ArrayGpuND<vec1i, vec4ub> data(50);

… initialize data …

gpuStack.push( data.gpu_range(0, 50) );

gpuStack.pop( data.gpu_range(0, 50) );

Page 47: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

47

GPU StackGPU Stack

• Push– Add N contiguous elements to “top”

New “top” Old “top”

Page 48: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

48

GPU StackGPU Stack

• Pop– Remove N elements from “top”

Old “top”

Page 49: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

49

GPU StackGPU Stack

• Pop– Remove N elements from “top”

New “top”

Result stream

Page 50: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

50

More ExamplesMore Examples

• See “Adaptive” case study in this course

• “Dynamic Adaptive Shadow Maps”– SIGGRAPH 2005 Sketch (Thursday, 1:45pm)

• “Octree Textures on Graphics Hardware”– SIGGRAPH 2005 Sketch (Thursday, 1:45pm)

Page 51: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

51

Static Analysis of Generated Static Analysis of Generated Glift CodeGlift Code• Static instruction results

– With Cg program specialization

Glift By-Hand Brook– 1D 2D 4 3 4– 3D page table 5 5– ASM 9 9– Octree 10 9– ASM + offset 10 9

– Conclusion : Glift structures within 1 instr of hand-coded Cg

Measured with NVShaderPerf, NVIDIA driver 75.22, Cg 1.4a

Application

Page 52: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

52

OverviewOverview

• Motivation• Abstraction• Glift template library• Conclusions

Page 53: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

53

SummarySummary

• GPU programming needs data structure abstraction– More complex data structures and algorithms

• Keep them separate!

– Iterators clarify GPU memory access patterns

• Why programmable address translation?– Common pattern in many GPU apps– Small amount of code virtualizes GPU memory

model– Data-parallel computing requires address space

Page 54: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

54

SummarySummary

• Glift template library• Generic C++/Cg implementation of abstraction• Nearly as efficient as hand coding• Easily integrates into OpenGL/Cg programming

environment

Page 55: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

55

AcknowledgementsAcknowledgements• Craig Kolb, Nick Triantos NVIDIA• Fabio Pellacini

Cornell/Pixar

• Adam Moerschell, Yong Kil UCDavisSerban Porumbescu, Chris Co, ….

• Ross Whitaker, Chuck Hansen, Milan Ikits U. of Utah

• Karen and Kaia Lefohn

• National Science Foundation Graduate Fellowship• Department of Energy

Page 56: Glift: Generic, Efficient Random-Access GPU Data Structures Aaron Lefohn University of California, Davis.

56

More InformationMore Information

• Upcoming ACM Transactions on Graphics paper– “Glift : Generic, Efficient, Random-Access GPU Data

Structures”

• Upcoming release of Glift template library– Watch www.gpgpu.org for announcement

• Google “Lefohn GPU”– http://graphics.cs.ucdavis.edu/~lefohn/