This page contains Windows bias

About This Page

This page is part of the Azure documentation. It contains code examples and configuration instructions for working with Azure services.

Bias Analysis

Bias Types:
⚠️ windows_first
⚠️ powershell_heavy
⚠️ windows_tools
⚠️ missing_linux_example
Summary:
The documentation page demonstrates a strong Windows bias. All code examples and walkthroughs use Windows-specific tools (MS-MPI, cmd.exe, .NET/C#), and the installation and execution instructions are exclusively for Windows environments. Linux and Intel MPI are only mentioned in passing, with no concrete examples or code snippets provided for Linux users. The sample code, setup, and troubleshooting steps are all tailored to Windows, leaving Linux users without practical guidance.
Recommendations:
  • Add parallel Linux-focused sections with equivalent code samples using Python SDK, Bash shell commands, and Intel MPI.
  • Provide explicit Linux pool creation examples, including VM configuration and StartTask for installing Intel MPI.
  • Include sample coordination and application commands for Linux (e.g., using mpirun/mpiexec with Intel MPI in Bash).
  • Reference and link to Linux-specific sample projects and walkthroughs, not just Windows/MS-MPI ones.
  • Ensure that all environment variable usage and file path examples are shown in both Windows and Linux syntax.
  • Balance the order of presentation so that Linux and Windows are treated equally, rather than Windows-first.
GitHub Create pull request

Scan History

Date Scan ID Status Bias Status
2025-07-12 23:44 #41 in_progress ❌ Biased
2025-07-12 00:58 #8 cancelled ✅ Clean
2025-07-10 05:06 #7 processing ✅ Clean

Flagged Code Snippets

// Create a StartTask for the pool which we use for installing MS-MPI on // the nodes as they join the pool (or when they are restarted). StartTask startTask = new StartTask { CommandLine = "cmd /c MSMpiSetup.exe -unattend -force", ResourceFiles = new List<ResourceFile> { new ResourceFile("https://mystorageaccount.blob.core.windows.net/mycontainer/MSMpiSetup.exe", "MSMpiSetup.exe") }, UserIdentity = new UserIdentity(new AutoUserSpecification(elevationLevel: ElevationLevel.Admin)), WaitForSuccess = true }; myCloudPool.StartTask = startTask; // Commit the fully configured pool to the Batch service to actually create // the pool and its compute nodes. await myCloudPool.CommitAsync();
CloudPool myCloudPool = myBatchClient.PoolOperations.CreatePool( poolId: "MultiInstanceSamplePool", targetDedicatedComputeNodes: 3 virtualMachineSize: "standard_d1_v2", VirtualMachineConfiguration: new VirtualMachineConfiguration( imageReference: new ImageReference( publisher: "MicrosoftWindowsServer", offer: "WindowsServer", sku: "2019-datacenter-core", version: "latest"), nodeAgentSkuId: "batch.node.windows amd64"); // Multi-instance tasks require inter-node communication, and those nodes // must run only one task at a time. myCloudPool.InterComputeNodeCommunicationEnabled = true; myCloudPool.TaskSlotsPerNode = 1;
// Create the multi-instance task. Its command line is the "application command" // and will be executed *only* by the primary, and only after the primary and // subtasks execute the CoordinationCommandLine. CloudTask myMultiInstanceTask = new CloudTask(id: "mymultiinstancetask", commandline: "cmd /c mpiexec.exe -wdir %AZ_BATCH_TASK_SHARED_DIR% MyMPIApplication.exe"); // Configure the task's MultiInstanceSettings. The CoordinationCommandLine will be executed by // the primary and all subtasks. myMultiInstanceTask.MultiInstanceSettings = new MultiInstanceSettings(numberOfNodes) { CoordinationCommandLine = @"cmd /c start cmd /c ""%MSMPI_BIN%\smpd.exe"" -d", CommonResourceFiles = new List<ResourceFile> { new ResourceFile("https://mystorageaccount.blob.core.windows.net/mycontainer/MyMPIApplication.exe", "MyMPIApplication.exe") } }; // Submit the task to the job. Batch will take care of splitting it into subtasks and // scheduling them for execution on the nodes. await myBatchClient.JobOperations.AddTaskAsync("mybatchjob", myMultiInstanceTask);
// Obtain the job and the multi-instance task from the Batch service CloudJob boundJob = batchClient.JobOperations.GetJob("mybatchjob"); CloudTask myMultiInstanceTask = boundJob.GetTask("mymultiinstancetask"); // Now obtain the list of subtasks for the task IPagedEnumerable<SubtaskInformation> subtasks = myMultiInstanceTask.ListSubtasks(); // Asynchronously iterate over the subtasks and print their stdout and stderr // output if the subtask has completed await subtasks.ForEachAsync(async (subtask) => { Console.WriteLine("subtask: {0}", subtask.Id); Console.WriteLine("exit code: {0}", subtask.ExitCode); if (subtask.State == SubtaskState.Completed) { ComputeNode node = await batchClient.PoolOperations.GetComputeNodeAsync(subtask.ComputeNodeInformation.PoolId, subtask.ComputeNodeInformation.ComputeNodeId); NodeFile stdOutFile = await node.GetNodeFileAsync(subtask.ComputeNodeInformation.TaskRootDirectory + "\\" + Constants.StandardOutFileName); NodeFile stdErrFile = await node.GetNodeFileAsync(subtask.ComputeNodeInformation.TaskRootDirectory + "\\" + Constants.StandardErrorFileName); stdOut = await stdOutFile.ReadAsStringAsync(); stdErr = await stdErrFile.ReadAsStringAsync(); Console.WriteLine("node: {0}:", node.Id); Console.WriteLine("stdout.txt: {0}", stdOut); Console.WriteLine("stderr.txt: {0}", stdErr); } else { Console.WriteLine("\tSubtask {0} is in state {1}", subtask.Id, subtask.State); } });