void cudaGaugeField::loadCPUField(const cpuGaugeField &cpu) { checkField(cpu); // FIXME anisotropy_ = anisotropy; X_ = x; t_boundary_ = t_boundary; #ifdef MULTI_GPU cpu.exchangeGhost(); #endif if (precision == QUDA_DOUBLE_PRECISION) { if (cpu.Precision() == QUDA_DOUBLE_PRECISION) { loadGaugeField((double2*)(even), (double2*)(odd), (double*)cpu.gauge, (double*)cpu.ghost, cpu.Order(), reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } else if (cpu.Precision() == QUDA_SINGLE_PRECISION) { loadGaugeField((double2*)(even), (double2*)(odd), (float*)cpu.gauge, (float*)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } } else if (precision == QUDA_SINGLE_PRECISION) { if (cpu.Precision() == QUDA_DOUBLE_PRECISION) { if (reconstruct == QUDA_RECONSTRUCT_NO) { loadGaugeField((float2*)(even), (float2*)(odd), (double*)cpu.gauge, (double*)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } else { loadGaugeField((float4*)(even), (float4*)(odd), (double*)cpu.gauge, (double*)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } } else if (cpu.Precision() == QUDA_SINGLE_PRECISION) { if (reconstruct == QUDA_RECONSTRUCT_NO) { loadGaugeField((float2*)(even), (float2*)(odd), (float*)cpu.gauge, (float*)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } else { loadGaugeField((float4*)(even), (float4*)(odd), (float*)cpu.gauge, (float*)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } } } else if (precision == QUDA_HALF_PRECISION) { if (cpu.Precision() == QUDA_DOUBLE_PRECISION){ if (reconstruct == QUDA_RECONSTRUCT_NO) { loadGaugeField((short2*)(even), (short2*)(odd), (double*)cpu.gauge, (double*)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } else { loadGaugeField((short4*)(even), (short4*)(odd), (double*)cpu.gauge, (double*)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } } else if (cpu.Precision() == QUDA_SINGLE_PRECISION) { if (reconstruct == QUDA_RECONSTRUCT_NO) { loadGaugeField((short2*)(even), (short2*)(odd), (float*)cpu.gauge, (float*)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } else { loadGaugeField((short4*)(even), (short4*)(odd), (float*)cpu.gauge, (float*)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } } } }
void cudaGaugeField::loadCPUField(const cpuGaugeField &cpu, const QudaFieldLocation &pack_location) { checkField(cpu); if (pack_location == QUDA_CUDA_FIELD_LOCATION) { errorQuda("Not implemented"); // awaiting Guochun's new gauge packing } else if (pack_location == QUDA_CPU_FIELD_LOCATION) { // FIXME anisotropy_ = anisotropy; X_ = x; t_boundary_ = t_boundary; #ifdef MULTI_GPU //FIXME: if this is MOM field, we don't need exchange data if(link_type != QUDA_ASQTAD_MOM_LINKS){ cpu.exchangeGhost(); } #endif if (reconstruct != QUDA_RECONSTRUCT_10) { // gauge field if (precision == QUDA_DOUBLE_PRECISION) { if (cpu.Precision() == QUDA_DOUBLE_PRECISION) { loadGaugeField((double2*)(even), (double2*)(odd), (double*)cpu.gauge, (double**)cpu.ghost, cpu.Order(), reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } else if (cpu.Precision() == QUDA_SINGLE_PRECISION) { loadGaugeField((double2*)(even), (double2*)(odd), (float*)cpu.gauge, (float**)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } } else if (precision == QUDA_SINGLE_PRECISION) { if (cpu.Precision() == QUDA_DOUBLE_PRECISION) { if (reconstruct == QUDA_RECONSTRUCT_NO) { loadGaugeField((float2*)(even), (float2*)(odd), (double*)cpu.gauge, (double**)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } else { loadGaugeField((float4*)(even), (float4*)(odd), (double*)cpu.gauge, (double**)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } } else if (cpu.Precision() == QUDA_SINGLE_PRECISION) { if (reconstruct == QUDA_RECONSTRUCT_NO) { loadGaugeField((float2*)(even), (float2*)(odd), (float*)cpu.gauge, (float**)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } else { loadGaugeField((float4*)(even), (float4*)(odd), (float*)cpu.gauge, (float**)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } } } else if (precision == QUDA_HALF_PRECISION) { if (cpu.Precision() == QUDA_DOUBLE_PRECISION){ if (reconstruct == QUDA_RECONSTRUCT_NO) { loadGaugeField((short2*)(even), (short2*)(odd), (double*)cpu.gauge, (double**)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } else { loadGaugeField((short4*)(even), (short4*)(odd), (double*)cpu.gauge, (double**)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } } else if (cpu.Precision() == QUDA_SINGLE_PRECISION) { if (reconstruct == QUDA_RECONSTRUCT_NO) { loadGaugeField((short2*)(even), (short2*)(odd), (float*)cpu.gauge, (float**)cpu.ghost, cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } else { loadGaugeField((short4*)(even), (short4*)(odd), (float*)cpu.gauge, (float**)(cpu.ghost), cpu.order, reconstruct, bytes, volumeCB, surfaceCB, pad, nFace, link_type, fat_link_max); } } } } else { // momentum field if (precision == QUDA_DOUBLE_PRECISION) { if (cpu.Precision() == QUDA_DOUBLE_PRECISION) { loadMomField((double2*)(even), (double2*)(odd), (double*)cpu.gauge, bytes, volumeCB, pad); } else if (cpu.Precision() == QUDA_SINGLE_PRECISION) { loadMomField((double2*)(even), (double2*)(odd), (float*)cpu.gauge, bytes, volumeCB, pad); } } else { if (cpu.Precision() == QUDA_DOUBLE_PRECISION) { loadMomField((float2*)(even), (float2*)(odd), (double*)cpu.gauge, bytes, volumeCB, pad); } else if (cpu.Precision() == QUDA_SINGLE_PRECISION) { loadMomField((float2*)(even), (float2*)(odd), (float*)cpu.gauge, bytes, volumeCB, pad); } } } // gauge or momentum } else { errorQuda("Invalid pack location %d", pack_location); } }