Spaces:
Runtime error
Runtime error
// This examples compares sorting performance using Array of Structures (AoS) | |
// and Structure of Arrays (SoA) data layout. Legacy applications will often | |
// store data in C/C++ structs, such as MyStruct defined below. Although | |
// Thrust can process array of structs, it is typically less efficient than | |
// the equivalent structure of arrays layout. In this particular example, | |
// the optimized SoA approach is approximately *five times faster* than the | |
// traditional AoS method. Therefore, it is almost always worthwhile to | |
// convert AoS data structures to SoA. | |
struct MyStruct | |
{ | |
int key; | |
float value; | |
__host__ __device__ | |
bool operator<(const MyStruct other) const | |
{ | |
return key < other.key; | |
} | |
}; | |
void initialize_keys(thrust::device_vector<int>& keys) | |
{ | |
thrust::default_random_engine rng; | |
thrust::uniform_int_distribution<int> dist(0, 2147483647); | |
thrust::host_vector<int> h_keys(keys.size()); | |
for(size_t i = 0; i < h_keys.size(); i++) | |
h_keys[i] = dist(rng); | |
keys = h_keys; | |
} | |
void initialize_keys(thrust::device_vector<MyStruct>& structures) | |
{ | |
thrust::default_random_engine rng; | |
thrust::uniform_int_distribution<int> dist(0, 2147483647); | |
thrust::host_vector<MyStruct> h_structures(structures.size()); | |
for(size_t i = 0; i < h_structures.size(); i++) | |
h_structures[i].key = dist(rng); | |
structures = h_structures; | |
} | |
int main(void) | |
{ | |
size_t N = 2 * 1024 * 1024; | |
// Sort Key-Value pairs using Array of Structures (AoS) storage | |
{ | |
thrust::device_vector<MyStruct> structures(N); | |
initialize_keys(structures); | |
timer t; | |
thrust::sort(structures.begin(), structures.end()); | |
assert(thrust::is_sorted(structures.begin(), structures.end())); | |
std::cout << "AoS sort took " << 1e3 * t.elapsed() << " milliseconds" << std::endl; | |
} | |
// Sort Key-Value pairs using Structure of Arrays (SoA) storage | |
{ | |
thrust::device_vector<int> keys(N); | |
thrust::device_vector<float> values(N); | |
initialize_keys(keys); | |
timer t; | |
thrust::sort_by_key(keys.begin(), keys.end(), values.begin()); | |
assert(thrust::is_sorted(keys.begin(), keys.end())); | |
std::cout << "SoA sort took " << 1e3 * t.elapsed() << " milliseconds" << std::endl; | |
} | |
return 0; | |
} | |