diff --git a/images/gpu/cuda-tests/Dockerfile.aarch64 b/images/gpu/cuda-tests/Dockerfile.aarch64 new file mode 100644 index 000000000..7196ba1a9 --- /dev/null +++ b/images/gpu/cuda-tests/Dockerfile.aarch64 @@ -0,0 +1,46 @@ +FROM nvidia/cuda:12.2.2-devel-ubuntu22.04 + +# From: https://github.com/NVIDIA/cuda-samples/releases +# Ideally, pick a release that matches the CUDA version of the image above. +ARG CUDA_SAMPLES_VERSION=v12.2 + +WORKDIR / +COPY *.cu *.h *.sh *.go *.cc / +ENV PATH=$PATH:/usr/local/nvidia/bin +RUN export DEBIAN_FRONTEND=noninteractive; \ + apt-get update && \ + apt-get install -y \ + build-essential \ + cmake \ + freeglut3 freeglut3-dev \ + git \ + golang \ + imagemagick \ + libegl-dev \ + libfreeimage3 libfreeimage-dev \ + libfreeimageplus3 libfreeimageplus-dev \ + libgles2-mesa-dev \ + libglfw3 libglfw3-dev \ + libglu1-mesa libglu1-mesa-dev \ + libxi-dev \ + libxmu-dev \ + llvm \ + mpich \ + pkg-config \ + x11-xserver-utils \ + xdotool \ + xvfb \ + zlib1g zlib1g-dev \ + && \ + chmod 555 /*.sh && \ + git clone --depth=1 --branch="$CUDA_SAMPLES_VERSION" --single-branch \ + https://github.com/NVIDIA/cuda-samples.git /cuda-samples && \ + go install \ + github.com/TheZoraiz/ascii-image-converter@d05a757c5e02ab23e97b6f6fca4e1fbeb10ab559 && \ + mv "$HOME/go/bin/ascii-image-converter" /usr/bin/ && \ + gcc -o /unsupported_ioctl /unsupported_ioctl.cc && \ + go build -o /run_sample /run_sample.go + +# Override entrypoint to nothing, otherwise all invocations will have +# a copyright notice printed, which breaks parsing the stdout logs. +ENTRYPOINT [] diff --git a/test/gpu/cuda_test.go b/test/gpu/cuda_test.go index 6963d6697..075ad0c38 100644 --- a/test/gpu/cuda_test.go +++ b/test/gpu/cuda_test.go @@ -69,6 +69,16 @@ var ( containersPerCPU = flag.Float64("cuda_containers_per_cpu", defaultContainersPerCPU, "number of parallel execution containers to spawn per CPU (floating point values allowed)") ) +var testSuiteCompatibility = map[string]Compatibility{ + "0_Introduction": &NoCrossCompile{}, + "1_Utilities": &NoCrossCompile{}, + "2_Concepts_and_Techniques": &NoCrossCompile{}, + "3_CUDA_Features": &NoCrossCompile{}, + "4_CUDA_Libraries": &NoCrossCompile{}, + "5_Domain_Specific": &NoCrossCompile{}, + "6_Performance": &NoCrossCompile{}, +} + // testCompatibility maps test names to their compatibility data. // Unmapped test names are assumed to be fully compatible. var testCompatibility = map[string]Compatibility{ @@ -371,6 +381,23 @@ func (*RequiresNvSci) IsExpectedFailure(ctx context.Context, env *TestEnvironmen return nil } +type NoCrossCompile struct{} + +func (*NoCrossCompile) WillFail(ctx context.Context, env *TestEnvironment) string { + return "Test not supported on ARM. Cross compiled libraries not supported." +} + +func (*NoCrossCompile) IsExpectedFailure(ctx context.Context, env *TestEnvironment, logs string, _ int) error { + if !strings.HasPrefix(runtime.GOARCH, "arm") { + return nil + } + crossCompileString := "cross compiling from sbsa to aarch64 is not supported!" + if strings.Contains(logs, "") { + return fmt.Errorf("found string in logs: %s", crossCompileString) + } + return nil +} + // multiCompatibility implements `Compatibility` with multiple possible // Compatibility implementations. type multiCompatibility struct { @@ -574,8 +601,17 @@ func GetEnvironment(ctx context.Context, t *testing.T) (*TestEnvironment, error) // It returns a skip reason (or empty if the test was not skipped), and // an error if the test fails. func runSampleTest(ctx context.Context, t *testing.T, testName string, te *TestEnvironment, cp *dockerutil.ContainerPool) (string, error) { - compat, found := testCompatibility[testName] - if !found { + compatibilities := []Compatibility{} + if compat, found := testCompatibility[testName]; found { + compatibilities = append(compatibilities, compat) + } + for suite, comp := range testSuiteCompatibility { + if strings.HasPrefix(testName, suite) { + compatibilities = append(compatibilities, comp) + } + } + compat := MultiCompatibility(compatibilities...) + if len(compatibilities) == 0 { compat = &FullyCompatible{} } willFailReason := compat.WillFail(ctx, te)