# Generated from the displayed GPU Lab example; no GPU timings are measured.
# Run: python example.py --device cpu  (default; no CPU/GPU transfers)
# Or:  python example.py --device cuda (compatible NVIDIA GPU and PyTorch required)
# Explicit CPU-only calculations remain on CPU in either mode.
import argparse
import torch

_lab_parser = argparse.ArgumentParser(description="Run this GPU Lab PyTorch example.")
_lab_parser.add_argument("--device", choices=["cpu", "cuda"], default="cpu")
_lab_device = _lab_parser.parse_args().device
if _lab_device == "cuda" and not torch.cuda.is_available():
    _lab_parser.error("CUDA mode needs an available NVIDIA GPU and compatible PyTorch installation.")
if _lab_device == "cpu":
    print("CPU mode checks values and layouts; it does not perform CPU-GPU transfers.")

# The displayed example, with its CUDA device requests selected by --device.
import torch

x = torch.arange(32 * 8, dtype=torch.float32).reshape(32, 8)
row = x[0, :]       # features of example 0: 0, 1, ..., 7
column = x[:, 0]   # feature 0 of each example: 0, 8, ..., 248

print(x.shape, x.stride())   # shape [32, 8], strides (8, 1)
print(row.stride())          # (1,)
print(column.stride())       # (8,)

packed_column = column.contiguous()
print(packed_column.stride())  # (1,)
