To best utilize available compute resources on the GPU, every cubature node for a given cell's structure factor is assigned to a single warp. Each warp then iterates through the atoms that have been assigned to a given cell, computing a basis function for each atom. Each thread computes a partial contribution to the cell's total structure factor by summing the basis functions that it calculates. After all atoms on the cell have been iterated, each warp performs a reduction of the partial structure factors to compute the total structure factor for the cell. The root lane thread in each warp then writes the final structure factor to the global memory.