{"id":943,"date":"2026-06-20T10:54:49","date_gmt":"2026-06-20T10:54:49","guid":{"rendered":"https:\/\/lastroundai.com\/blog\/interview-questions\/nvidia"},"modified":"2026-07-19T09:23:29","modified_gmt":"2026-07-19T03:53:29","slug":"nvidia","status":"publish","type":"iq","link":"https:\/\/lastroundai.com\/interview-questions\/nvidia","title":{"rendered":"Nvidia Interview Questions (2026): What They Actually Ask"},"content":{"rendered":"<p>When a candidate at a mid-size ML infrastructure team applied for a senior systems role at Nvidia in late 2024, the recruiter told him upfront: &#8220;This isn&#8217;t a LeetCode shop. We care a lot more about what you actually know than whether you can implement Dijkstra in 20 minutes.&#8221; He still had to solve two graph problems during the loop. But the recruiter wasn&#8217;t wrong, either.<\/p>\n<p>Nvidia&#8217;s interview process has a reputation that&#8217;s a bit hard to pin down. It&#8217;s not Google-style, where the loop is essentially six coding rounds with a sprinkle of behavioral. It&#8217;s not Meta-style, where system design dominates at senior levels. What Nvidia runs is closer to a domain expertise audit, and the weighting shifts depending on the team you&#8217;re interviewing with. For GPU architecture or CUDA-heavy roles, expect deep, sometimes uncomfortable questions about memory hierarchies. For platform or application-layer roles, the questions look more like a standard SWE loop at other large tech companies.<\/p>\n<p>This page covers what the 2026 Nvidia loop actually looks like, based on reported candidate experiences from Glassdoor, interviewing.io, TechPrep, and multiple community threads from candidates who went through it between 2024 and early 2026. The questions below are verified from those sources. I&#8217;ve noted where something is team-specific or unconfirmed.<\/p>\n<div class=\"iq-stats not-prose\"><div class=\"iq-stat\"><span class=\"iq-stat__value\">4-8 weeks<\/span><span class=\"iq-stat__label\">Process<\/span><\/div><div class=\"iq-stat\"><span class=\"iq-stat__value\">4-6<\/span><span class=\"iq-stat__label\">Rounds<\/span><\/div><div class=\"iq-stat\"><span class=\"iq-stat__value\">LC Medium<\/span><span class=\"iq-stat__label\">Coding<\/span><\/div><div class=\"iq-stat\"><span class=\"iq-stat__value\">Virtual onsite<\/span><span class=\"iq-stat__label\">Format<\/span><\/div><\/div>\n<div class=\"iq-dsec iq-dsec--easy\"><div class=\"iq-dsec__row\"><h2 class=\"iq-dsec__h\" id=\"easy\"><span class=\"iq-dsec__dot\" aria-hidden=\"true\"><\/span>Easy questions<\/h2><span class=\"iq-dsec__n\">15<\/span><\/div><div class=\"iq-dsec__bar\" aria-hidden=\"true\"><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Merge overlapping intervals<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Arrays<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Sort the intervals by start time. Iterate through, and for each interval, check if it overlaps with the last merged interval (i.e., its start is less than or equal to the last merged end). If yes, extend the end. If no, add it as a new interval.<\/p>\n<p>A staple that shows up across coding rounds and OAs alike. Expect edge cases: single-interval input, entirely overlapping intervals, and intervals that touch but do not overlap (e.g., [1,3] and [3,5], most interviewers want these merged).<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Determine if two strings are isomorphic<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">HashMap<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Use two hash maps: one mapping characters from s to t, one mapping characters from t to s. For each character pair (c1, c2), verify both mappings are consistent. If c1 already maps to something other than c2, or c2 already maps to something other than c1, return false.<\/p>\n<p>Reported in the same OA as the palindromic subsequence question. Seems like an easy warm-up but the bidirectional constraint catches people who only check one direction. Checking s-to-t alone allows &#8220;aa&#8221; and &#8220;ab&#8221; to incorrectly return true.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Bracket matching and expression validation<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Stack<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Stack-based approach. Push opening brackets onto the stack. When you encounter a closing bracket, check if the top of the stack is the matching opener. If yes, pop. If no, or if the stack is empty, return false. At the end, return true only if the stack is empty.<\/p>\n<p>Reported from a 2026 onsite. Some interviewers extend it to nested conditions or multi-character brackets (e.g., matching &lt;% %&gt; tokens in template syntax).<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Detect and remove a cycle in a linked list<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Linked Lists<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Floyd&#8217;s tortoise and hare. Move a slow pointer one node at a time and a fast pointer two nodes at a time. If the list has a cycle, they meet inside it. If the fast pointer hits null first, there&#8217;s no cycle.<\/p>\n<p>The part candidates fumble is finding the cycle&#8217;s entry point. Once slow and fast meet, reset one pointer to the head and advance both one step at a time, they&#8217;ll meet exactly at the entry node. To remove the cycle, walk from that entry point until you find the node whose next pointer points back to it, then set that pointer to null. Common on new-grad OAs and early phone screens, this one is a warm-up before the interviewer moves to something harder.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\ndef detect_and_remove_cycle(head):\n\n    slow = fast = head\n\n    has_cycle = False\n    while fast and fast.next:\n\n        slow = slow.next\n\n        fast = fast.next.next\n\n        if slow == fast:\n\n            has_cycle = True\n\n            break\n    if not has_cycle:\n\n        return head\n    # find the entry point of the cycle\n\n    ptr = head\n\n    while ptr != slow:\n\n        ptr = ptr.next\n\n        slow = slow.next\n    # walk the cycle to find the node pointing back to the entry\n\n    runner = slow\n\n    while runner.next != slow:\n\n        runner = runner.next\n\n    runner.next = None\n    return head\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Tell me about a project that failed. What did you learn?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Behavioral<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Nvidia interviewers can tell within a sentence whether you&#8217;re describing a real failure or a disguised humblebrag (&#8220;my code was so good the review took forever&#8221;). Name the actual mistake, a wrong technical assumption, a scope you underestimated, a communication gap with another team, and be specific about what it cost. A missed deadline. A rewrite. An incident.<\/p>\n<p>The answers that land describe a concrete process change, not a restated lesson. &#8220;I learned to test more&#8221; is forgettable. &#8220;I added a staging rollout step because we&#8217;d been shipping straight to prod, and that&#8217;s exactly how a null-pointer regression got through&#8221; is a story an interviewer remembers. Have a second example ready too, they sometimes ask whether you&#8217;ve actually applied the lesson since, on a different project.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Give an example of balancing speed against code quality with a specific trade-off you made.<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Behavioral<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Be concrete about what you cut, why, and what it cost. &#8220;We shipped a prototype without error handling to hit a demo deadline, then paid down the tech debt in sprint 3&#8221; is the kind of answer that lands. Vague answers (&#8220;I always try to balance both&#8221;) tell the interviewer nothing and signal that you haven&#8217;t made a real trade-off consciously.<\/p>\n<p>The follow-up is almost always: &#8220;Did that turn out to be the right call?&#8221; Have a real answer, even if it&#8217;s &#8220;no, we underestimated the maintenance cost.&#8221;<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Describe a cross-team miscommunication that caused a setback and how it was resolved.<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Behavioral<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>The &#8220;One Team&#8221; cultural question in disguise. Interviewers want to see that you take partial ownership even when the failure was partly someone else&#8217;s fault, and that you made a structural change to prevent recurrence. &#8220;We added a weekly sync&#8221; is acceptable. &#8220;We added a weekly sync and a shared doc that captured the decision and its rationale&#8221; is better because it shows you thought about the failure mode, not just the symptom.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Why Nvidia? What specifically about our current technical direction interests you?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Behavioral<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Every company asks this. Nvidia&#8217;s version is harder because they want specificity about the technical direction, Blackwell architecture, the CUDA ecosystem, the Triton compiler, DGX Cloud, NIM microservices, or whatever the team you&#8217;re interviewing with actually works on. Generic &#8220;AI is the future&#8221; answers are transparent and don&#8217;t work.<\/p>\n<p>Research what the specific team ships. For a CUDA platform role, that&#8217;s the CUDA toolkit release notes. For an inference role, that&#8217;s recent TensorRT-LLM changelog and the Triton blog. For a chip architecture role, that&#8217;s the Blackwell architecture paper from Hot Chips 2024.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Describe how you balance perfectionism with shipping on schedule.<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Behavioral<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Reported from multiple 2025 behavioral rounds. Answer with a real example of a ship-vs-quality call you made, including what you deferred and whether deferring it turned out to be the right call. If you deferred something that later caused an incident, say so, that&#8217;s a more credible and interesting answer than one where every trade-off worked out perfectly.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">How long does the Nvidia interview process take from application to offer?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Most candidates report 4 to 8 weeks. If you have a referral, that compresses to 3 to 4 weeks in some cases. The longest part is usually waiting between the onsite and the team-matching calls, which can take 1 to 2 weeks after the loop completes.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Do Nvidia coding interviews focus on hard LeetCode problems?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Mostly medium difficulty, but with a genuine emphasis on correctness, follow-up questions, and the reasoning behind your choices. A handful of reported questions are hard-difficulty (Special Binary String, Basic Calculator III), but the median difficulty in the coding rounds is medium. What separates Nvidia from pure LeetCode shops is the follow-up questioning, a clean medium solution that you can defend at depth is worth more than a stumbling hard solution you can&#8217;t explain.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Do I need CUDA experience to get a software engineering role at Nvidia?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>It depends heavily on the team. For GPU architecture, CUDA platform, driver, or compiler roles, yes, you&#8217;ll get detailed CUDA questions and need real hands-on experience. For application-layer SWE roles (developer tools, platform infrastructure, data engineering), the CUDA questions are lighter and more conceptual. Ask your recruiter which category your loop falls into. It&#8217;s a fair question and they&#8217;ll tell you.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">What does the new grad Nvidia interview look like?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>New grads start with a HackerRank online assessment: 2 to 3 coding problems and 25 multiple-choice questions, 70 to 90 minutes. Topics include C\/C++ fundamentals, OS basics, DSA, and probability. Candidates who pass get a recruiter call, then 3 to 4 technical and behavioral rounds. Nvidia reportedly reviews resumes before sending the OA link, so it&#8217;s not a pure volume-screener. New grad internship conversion rate is 60 to 70% for those who complete a summer internship.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">How important is C++ for Nvidia interviews?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Very important for systems and GPU roles. Interviewers will go deep on memory management, RAII, virtual dispatch, threading primitives, and template mechanics. For ML systems or application-layer roles, Python is acceptable in coding rounds but interviewers often ask C++ conceptual questions anyway. If you&#8217;re applying to any role with &#8220;systems,&#8221; &#8220;compiler,&#8221; &#8220;driver,&#8221; or &#8220;CUDA&#8221; in the title, C++ fluency is effectively a prerequisite.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Does Nvidia ask system design questions for new grads?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">FAQ<\/span><span class=\"iq-badge iq-badge--easy\">Easy<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Usually not in full, the new grad loop is more coding and conceptual questions. At senior and staff levels, system design is a full dedicated round (60 minutes). Mid-level loops vary by team. Some teams include a lighter design conversation in the hiring manager round even for junior roles.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-dsec iq-dsec--medium\"><div class=\"iq-dsec__row\"><h2 class=\"iq-dsec__h\" id=\"medium\"><span class=\"iq-dsec__dot\" aria-hidden=\"true\"><\/span>Medium questions<\/h2><span class=\"iq-dsec__n\">28<\/span><\/div><div class=\"iq-dsec__bar\" aria-hidden=\"true\"><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Implement an LRU cache<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Data Structures<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Use a HashMap for O(1) key lookups combined with a doubly linked list to track recency order. The list head holds the most recently used entry; the tail holds the least recently used. On a get, move the node to the head. On a put that exceeds capacity, evict the tail node and remove its key from the map.<\/p>\n<p>Nvidia interviewers frequently extend this question into a follow-up about GPU memory caching semantics, or ask how you&#8217;d make it thread-safe using a read-write lock. The thread-safety extension is specifically reported from 2025 onsites for systems roles.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\nfrom collections import OrderedDict\nclass LRUCache:\n\n    def __init__(self, capacity: int):\n\n        self.cap = capacity\n\n        self.cache = OrderedDict()\n    def get(self, key: int) -&gt; int:\n\n        if key not in self.cache:\n\n            return -1\n\n        self.cache.move_to_end(key)\n\n        return self.cache[key]\n    def put(self, key: int, value: int) -&gt; None:\n\n        if key in self.cache:\n\n            self.cache.move_to_end(key)\n\n        self.cache[key] = value\n\n        if len(self.cache) &gt; self.cap:\n\n            self.cache.popitem(last=False)\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Find the k most frequent elements from an integer stream<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Heap<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Maintain a min-heap of size k alongside a hash map of element frequencies. For each element, update its count in the map. If the heap has fewer than k entries, push it. If the element&#8217;s count exceeds the heap&#8217;s minimum, pop the minimum and push the new element.<\/p>\n<p>The stream aspect is the real test. Candidates who hard-code a &#8220;collect all, then sort&#8221; approach get pushed on it immediately. Interviewers want to see you reason about bounded memory and online processing.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\nimport heapq\n\nfrom collections import defaultdict\ndef top_k_frequent_stream(stream, k):\n\n    freq = defaultdict(int)\n\n    # min-heap: (count, element)\n\n    heap = []\n\n    seen = set()\n    for num in stream:\n\n        freq[num] += 1\n\n        if num not in seen:\n\n            seen.add(num)\n\n            heapq.heappush(heap, (freq[num], num))\n\n        else:\n\n            # rebuild heap with updated freq (simplified approach)\n\n            heap = [(freq[x], x) for x in seen]\n\n            heapq.heapify(heap)\n    # return top k\n\n    return [x for _, x in heapq.nlargest(k, heap)]\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Detect a cycle in a directed graph<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Graphs<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>DFS with a recursion stack (a set of nodes currently on the active call stack) and a visited set. If DFS reaches a node already in the recursion stack, a cycle exists. After finishing DFS from a node, remove it from the recursion stack.<\/p>\n<p>Reported in multiple online assessment write-ups from 2024-2026. Common follow-up: &#8220;how does this change for an undirected graph?&#8221; The undirected version only needs a visited set and parent tracking, not a separate recursion stack.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\ndef has_cycle(graph):\n\n    visited = set()\n\n    rec_stack = set()\n    def dfs(node):\n\n        visited.add(node)\n\n        rec_stack.add(node)\n\n        for neighbor in graph.get(node, []):\n\n            if neighbor not in visited:\n\n                if dfs(neighbor):\n\n                    return True\n\n            elif neighbor in rec_stack:\n\n                return True\n\n        rec_stack.remove(node)\n\n        return False\n    for node in graph:\n\n        if node not in visited:\n\n            if dfs(node):\n\n                return True\n\n    return False\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Search in a rotated sorted array<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Binary Search<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Modified binary search. At each step, determine which half of the array is sorted (compare mid to the boundaries). If the target falls within the sorted half, search there. Otherwise, search the other half.<\/p>\n<p>Reported as a phone screen question. Follow-ups often ask about the case with duplicate elements, which breaks the standard approach and requires a fallback to linear search in the worst case (O(n)).<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Longest palindromic subsequence<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Dynamic Programming<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Bottom-up DP table where dp[i][j] represents the length of the longest palindromic subsequence in s[i..j]. If s[i] == s[j], dp[i][j] = dp[i+1][j-1] + 2. Otherwise, dp[i][j] = max(dp[i+1][j], dp[i][j-1]). Fill diagonally from shorter substrings to longer.<\/p>\n<p>Reported in an OA from a candidate in 2024. Bottom-up DP is preferred over memoized recursion because it&#8217;s easier to talk through under time pressure and avoids stack overhead on long inputs.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Find the kth largest element in an unsorted array<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Heap \/ Quickselect<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Two valid approaches, and Nvidia interviewers want to hear both along with their trade-offs. A min-heap of size k gives O(n log k) time and holds only the k largest elements seen so far, evicting the smallest whenever the heap exceeds size k. Quickselect, a variant of quicksort&#8217;s partitioning step, gives O(n) average time by recursing into only the half of the array that contains the kth position, but degrades to O(n^2) on adversarial input unless the pivot is randomized.<\/p>\n<p>Reported as a phone screen and OA staple. The follow-up almost always asks which approach fits a streaming input (heap, since quickselect needs the full array in memory) versus a fixed array you&#8217;re allowed to mutate in place (quickselect, since it skips the heap&#8217;s log factor).<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">python<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-python\">\n\nimport random\ndef find_kth_largest(nums, k):\n\n    target = len(nums) \u2013 k  # index if nums were sorted ascending\n    def partition(left, right, pivot_index):\n\n        pivot = nums[pivot_index]\n\n        nums[pivot_index], nums[right] = nums[right], nums[pivot_index]\n\n        store_index = left\n\n        for i in range(left, right):\n\n            if nums[i] &lt; pivot:\n\n                nums[store_index], nums[i] = nums[i], nums[store_index]\n\n                store_index += 1\n\n        nums[right], nums[store_index] = nums[store_index], nums[right]\n\n        return store_index\n    left, right = 0, len(nums) \u2013 1\n\n    while True:\n\n        pivot_index = random.randint(left, right)\n\n        new_pivot_index = partition(left, right, pivot_index)\n\n        if new_pivot_index == target:\n\n            return nums[new_pivot_index]\n\n        elif new_pivot_index &lt; target:\n\n            left = new_pivot_index + 1\n\n        else:\n\n            right = new_pivot_index \u2013 1\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Walk through a C++ code snippet with constructors and destructors<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">C++<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Interviewers present a short snippet and ask you to trace execution line by line: which constructor fires, when does the destructor run, is there a memory leak? Copy construction vs. the assignment operator is a common gotcha. RAII semantics and when a copy constructor gets implicitly called (e.g., passing by value) are the real focus.<\/p>\n<p>The question tests whether you understand the object lifecycle, not just that you can write classes. Interviewers at Nvidia care about whether you know when the destructor runs for stack-allocated vs. heap-allocated objects.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Implement a smart pointer with reference counting<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">C++<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>The core requirement: maintain a shared reference count on the heap alongside the managed object. The copy constructor increments the count; the destructor decrements it and frees the object when the count reaches zero. The assignment operator must handle self-assignment and correctly decrement the old referent.<\/p>\n<p>Reported from a 2025 onsite. Tests whether you actually understand RAII vs. whether you&#8217;ve just used std::shared_ptr. Interviewers follow up on circular references, two shared_ptr objects pointing at each other, both with refcount 1, which never reaches zero and leaks. The fix is std::weak_ptr.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Synchronize output between two threads using semaphores<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Concurrency<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Create two semaphores initialized to 1 and 0. Thread A waits on semaphore 1, prints its output, then signals semaphore 2. Thread B waits on semaphore 2, prints its output, then signals semaphore 1. This enforces strict alternation.<\/p>\n<p>Reported from an internship technical round. The problem is easy to state but hard to get exactly right without introducing a race condition. Interviewers watch for incorrect initialization values and for code that signals before printing, which allows the other thread to proceed before the output is actually written.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Explain virtual functions and vtable layout, when do they add overhead?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">C++<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Each class with virtual functions has a vtable: a static array of function pointers. Each object of that class holds a hidden vptr (pointer to its vtable). Virtual dispatch dereferences the vptr, looks up the function pointer in the vtable, and calls it, adding one indirection and potentially a cache miss compared to a direct call.<\/p>\n<p>Overhead matters in tight GPU driver loops where call frequency is very high. Interviewers also cover lambda captures (closures vs. function pointers), template instantiation (compile-time polymorphism with zero runtime overhead), and move semantics (avoiding unnecessary copies of large buffers).<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">What is false sharing and how do you prevent it in multithreaded C++ code?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">C++ \/ Concurrency<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>False sharing happens when two threads write to different variables that happen to sit on the same cache line, typically 64 bytes. The cache coherence protocol treats the whole line as dirty on every write, so it invalidates the other core&#8217;s copy even though the two threads never touch the same variable. The result looks like a data race in a profiler, cores repeatedly re-fetching a line from a neighbor&#8217;s cache, but it&#8217;s really a memory layout problem, not a logic bug.<\/p>\n<p>Fix it by padding hot per-thread counters or state to their own cache line (alignas(64) on the struct), or by reorganizing data so per-thread fields aren&#8217;t adjacent, structure-of-arrays instead of array-of-structures for the hot fields. Nvidia driver and runtime code hits this constantly, since independent per-thread counters and queue heads are exactly the pattern that triggers it.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">cpp<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-cpp\">\n\n#include &lt;atomic&gt;\nstruct PaddedCounter {\n\n    alignas(64) std::atomic&lt;long&gt; count;\n\n    char padding[64 \u2013 sizeof(std::atomic&lt;long&gt;)];\n\n};\nPaddedCounter counters[NUM_THREADS]; \/\/ one cache line per thread\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Explain the difference between SIMD and SIMT execution models<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">GPU Architecture<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>SIMD applies one instruction to multiple data lanes in strict lockstep, the classic example being CPU vector units like AVX, where there&#8217;s no real per-lane control flow. SIMT, Nvidia&#8217;s model, groups 32 threads into a warp and issues one instruction to all of them, but each thread keeps its own program counter and register state conceptually, so threads can take different branches.<\/p>\n<p>That flexibility isn&#8217;t free. When threads in a warp diverge, the hardware runs both branch paths and masks off the threads that shouldn&#8217;t be active for each one, which is why the warp divergence question later in this section matters so much. Interviewers tend to ask this one first, as a check on whether you actually know what a warp is before they ask you to optimize around it.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Explain memory coalescing in CUDA and its impact on performance<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">CUDA<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>When threads in a warp access contiguous memory addresses, the GPU combines those into a single memory transaction. Non-coalesced access forces multiple transactions and tanks bandwidth, in pathological cases, you can lose 10x or more of available memory bandwidth.<\/p>\n<p>The follow-up is almost always: &#8220;How do you restructure a matrix transpose kernel to achieve coalesced access?&#8221; The answer: load a tile of the input into shared memory using coalesced reads, then write from shared memory to the transposed output location (which would be non-coalesced from global memory directly).<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Shared memory vs. global memory in CUDA, how does your choice affect a kernel?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">CUDA<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Shared memory has roughly 100x lower latency than global memory but is limited per thread block, typically 48 to 96 KB on recent GPUs (H100 offers up to 228 KB with dynamic configuration). Load data into shared memory when threads in a block will reuse it multiple times. The access pattern within shared memory also matters: bank conflicts occur when multiple threads in a warp access different addresses that map to the same memory bank, serializing those accesses.<\/p>\n<p>Interviewers want you to connect shared memory decisions to coalescing decisions. They&#8217;re two sides of the same optimization: coalesced global reads fill shared memory efficiently, and then shared memory provides low-latency reuse for the computation phase.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Describe GPU warp scheduling and strategies to minimize thread divergence<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">GPU Architecture<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>A warp is 32 threads executed in lockstep on a single streaming multiprocessor. When threads within a warp take different branch paths, the hardware serializes those paths, it executes the true branch with some threads active and the false branch with the remaining threads active, then merges. Both paths run, even the ones that aren&#8217;t &#8220;taken&#8221; for a given thread.<\/p>\n<p>Strategies to reduce divergence: restructure data so that threads within a warp process elements of the same type (reducing branch probability), use predicated instructions for short branches where both paths are cheap, and avoid dynamic indexing into shared memory where the index depends on thread ID in a non-uniform way.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">How do you profile a CUDA application? Walk through your toolset and methodology.<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">CUDA \/ Profiling<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Nvidia Nsight Systems for timeline analysis: CPU-GPU interaction, kernel launch overhead, synchronization points, and data transfer timing. Nsight Compute for kernel-level profiling: warp efficiency, memory throughput, achieved occupancy, and instruction mix. The distinction matters, Nsight Systems answers &#8220;where is time being spent at the application level?&#8221; while Nsight Compute answers &#8220;why is this specific kernel slow?&#8221;<\/p>\n<p>The candidate account that reported this said the interviewer specifically asked when you&#8217;d use each tool and followed up by asking how you&#8217;d instrument a multi-GPU training run. For that case, the answer involves NCCL profiling hooks and per-rank timeline correlation in Nsight Systems.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Explain virtual memory and its implications for GPU performance<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">GPU Architecture<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>GPU virtual memory via CUDA Unified Virtual Memory (UVM) allows CPU and GPU to share an address space. The cost: page faults trigger expensive migrations between host and device memory, with each fault adding microseconds of latency. For workloads that access memory in predictable patterns, pinned (page-locked) host memory with explicit cudaMemcpy transfers is almost always faster than relying on UVM page migration.<\/p>\n<p>Interviewers want you to know when UVM is acceptable (prototyping, irregular access patterns that are too complex to manage manually, very large datasets that exceed GPU memory) vs. when it&#8217;s a performance liability (hot-path inference, latency-sensitive kernels).<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Kernel mode vs. user mode, why does it matter for systems performance?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Systems<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Context switches between kernel and user mode carry overhead, typically in the hundreds of nanoseconds range. For GPU work, this surfaces in driver calls, every cudaMalloc, every kernel launch, every cudaMemcpy crosses the kernel-user boundary. Minimizing cudaMalloc frequency (pre-allocate a pool, reuse buffers), batching kernel launches, and using CUDA streams to overlap compute with data transfers all reduce this overhead.<\/p>\n<p>This comes up for driver and compiler roles more than for application-layer roles, but Nvidia expects any systems candidate to know it.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">How do CUDA streams let you overlap compute with data transfer?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">CUDA \/ Performance<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>The default stream serializes everything, a kernel launch and a memory copy issued on it run one after the other even if they don&#8217;t depend on each other. Non-default streams change that. Issue a kernel on stream A and a cudaMemcpyAsync on stream B, and modern GPUs, which have separate copy engines from their compute engines, run them concurrently.<\/p>\n<p>The catch that trips people up: this only works with pinned (page-locked) host memory, allocated via cudaMallocHost or cudaHostAlloc. Pageable memory can&#8217;t be transferred asynchronously, the driver stages it through a pinned buffer first, which silently serializes your &#8220;concurrent&#8221; transfer. Interviewers ask this as a follow-up almost every time, it&#8217;s the detail that separates someone who&#8217;s read the CUDA programming guide from someone who&#8217;s actually pipelined a real workload.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">How do you optimize deep learning model inference for GPUs?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">ML Systems<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Layer fusion combines adjacent operations (e.g., conv + batch norm + ReLU) into a single kernel, eliminating intermediate memory writes and reads. Quantization (INT8 or FP8 for inference where precision tolerance allows) reduces memory bandwidth and increases throughput on hardware with dedicated low-precision units. Kernel auto-tuning via TensorRT finds the best kernel implementation for a given input shape. Batching requests amortizes kernel launch overhead and maximizes GPU utilization between calls. For the serving layer, Triton Inference Server comes up frequently in reported questions.<\/p>\n<p>Interviewers at Nvidia want you to connect these optimizations to hardware realities, not just recite a checklist. &#8220;Layer fusion reduces memory round-trips because each intermediate tensor otherwise sits in global memory between operations&#8221; is the level of reasoning they&#8217;re looking for.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Tell me about a time you learned an entirely new technology domain under time pressure.<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Behavioral<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Be specific about the timeline, how you ramped (documentation? colleagues? experiments?), what you got wrong first, and what the outcome was. Nvidia engineers work on emerging hardware and software stacks where the documentation is sometimes a week old or nonexistent. The question tests whether you can self-direct learning in novel territory, not whether you&#8217;ve memorized existing frameworks.<\/p>\n<p>Interviewers follow up by asking what resources were most useful and what you&#8217;d do differently if you had to do it again. Vague answers (&#8220;I read the docs and asked questions&#8221;) don&#8217;t land here.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Describe a time you disagreed with a senior engineer&#039;s technical approach and how you handled it.<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Behavioral<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>The &#8220;intellectual honesty&#8221; value in practice. Interviewers want to see that you can hold a position with evidence and change your mind with evidence. Pure deference to seniority is a red flag. So is stubbornness that ignores new information when it arrives. The strongest answers describe a specific technical disagreement, the evidence you brought to the conversation, what the outcome was, and whether, in retrospect, the decision was correct.<\/p>\n<p>This question frequently turns into a 20-minute technical discussion about the actual trade-off. Prepare your story with the same technical depth you&#8217;d bring to a system design question.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Tell me about identifying a critical performance bottleneck others had missed.<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Behavioral<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Strong answers name the actual tool you used to find it, perf, Nsight, flamegraph, custom instrumentation, a printf at the right place. Name what made it hard to see (it only appeared under production traffic patterns, it was masked by another bottleneck, the tooling didn&#8217;t expose it directly). And give the actual size of the win.<\/p>\n<p>Round numbers (&#8220;it was 2x faster&#8221;) get follow-up questions about how you measured. If you don&#8217;t have a rigorous measurement story, you&#8217;ll get pressed on it. Nvidia engineers profile things; they don&#8217;t estimate.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">How do you make critical decisions when you have incomplete information?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">Behavioral<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Real answer structure: first, identify what decision is actually irreversible vs. reversible, irreversible decisions (architectural choices, API contracts) warrant more information-gathering before committing; reversible decisions should be made faster. Second, bound your uncertainty with a quick experiment or proxy measurement rather than waiting for complete data. Third, commit with an explicit trigger to revisit (a date, a metric threshold, a milestone).<\/p>\n<p>Vague answers (&#8220;I gather as much data as possible&#8221;) don&#8217;t land well here. Nvidia is building hardware on 3-year cycles, every decision at some level is made with incomplete information. They want to know your actual process.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Explain the computational and memory complexity of self-attention<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">LLM Systems<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>For a sequence of length n and hidden dimension d, computing the attention scores QK^T costs O(n^2 * d), and the attention matrix itself takes O(n^2) memory. Double the context length and you quadruple the compute and memory cost of the attention block specifically, the feed-forward layers stay linear in n. That quadratic wall is why FlashAttention exists, it fuses the softmax and the two matmuls so the full n x n matrix never gets materialized in HBM, only computed in tiles that fit in on-chip SRAM.<\/p>\n<p>Interviewers often connect this straight to the KV-cache question below. During generation, each new token only attends against the cached keys and values, so the quadratic cost gets paid once during prefill, not per token during decode. Candidates who conflate the two, and claim generation itself is quadratic per token, get corrected fast.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Explain autoregressive decoding with KV-cache.<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">LLM Systems<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>In autoregressive generation, each new token attends to all previous tokens. Without a cache, you&#8217;d recompute the key and value tensors for every previous token at every decoding step, O(n^2) total compute for a sequence of length n. KV-cache stores those key and value tensors after they&#8217;re computed, so each decoding step only computes attention for the new token against the cached context.<\/p>\n<p>The cost: memory grows linearly with sequence length and batch size, which is why PagedAttention (vLLM) and sliding window attention (Mistral) exist. Reported from a phone screen for an LLM-focused role. Interviewers often follow up by asking how you&#8217;d manage KV-cache memory when multiple requests have different sequence lengths in the same batch.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">What is low-rank adaptation (LoRA) and when do you use it over full fine-tuning?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">LLM Systems<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>LoRA freezes base model weights and trains small rank-decomposed matrices injected into the attention layers. The update to a weight matrix W is expressed as W + AB, where A is (d x r) and B is (r x d), and r is much smaller than d. Much lower memory footprint than full fine-tuning, at a cost of some expressiveness for tasks that require large distributional shifts from the base model.<\/p>\n<p>Used when you have limited GPU budget, when you need fast task-switching between many adapters (LoRA multiplexing in production serving), or when the base model is already close to the target task. Full fine-tuning is worth the cost when LoRA&#8217;s rank limitation actually constrains performance, which is task-dependent and usually determined empirically.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">What is gradient checkpointing and when do you use it?<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">ML Systems \/ Training<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Standard backprop keeps every intermediate activation from the forward pass around for the backward pass, so memory scales with layer count times batch size times sequence length. Gradient checkpointing throws most of that away and recomputes it on demand during the backward pass instead, trading roughly 20 to 30% more compute time for activation memory that&#8217;s often the difference between a model fitting on your GPU budget and not fitting at all.<\/p>\n<p>You reach for it when you&#8217;re memory-bound rather than compute-bound, which describes most large transformer training runs on a fixed cluster. Interviewers sometimes push on placement, checkpointing every transformer block is the standard granularity. Checkpoint too finely and the recomputation overhead eats the memory savings you were trying to get.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-dsec iq-dsec--hard\"><div class=\"iq-dsec__row\"><h2 class=\"iq-dsec__h\" id=\"hard\"><span class=\"iq-dsec__dot\" aria-hidden=\"true\"><\/span>Hard questions<\/h2><span class=\"iq-dsec__n\">5<\/span><\/div><div class=\"iq-dsec__bar\" aria-hidden=\"true\"><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Implement a thread-safe lock-free memory pool allocator for variable-size GPU buffer allocations<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">C++ \/ Systems<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>This comes up in senior loops. The expected approach uses atomic compare-and-swap operations on a free-list head pointer, with careful alignment to cache line boundaries. Pre-allocate a large contiguous slab and track free blocks with a lock-free stack of block pointers using std::atomic.<\/p>\n<p>Interviewers care about the reasoning as much as the code. &#8220;Why lock-free?&#8221; is always a follow-up. The expected answer: mutex contention at GPU driver call frequency creates measurable latency spikes that a lock-free approach avoids, at the cost of more complex ABA-problem handling.<\/p>\n<p><div class=\"iq-code not-prose\"><div class=\"iq-code__bar\"><span class=\"iq-code__lang\">cpp<\/span><button class=\"iq-code__copy\" type=\"button\">Copy<\/button><\/div><pre><code class=\"language-cpp\">\n\n#include &lt;atomic&gt;\n\n#include &lt;cstddef&gt;\n\n#include &lt;cstdlib&gt;\nstruct Block {\n\n    Block* next;\n\n};\nclass LockFreePool {\n\n    std::atomic&lt;Block*&gt; head;\npublic:\n\n    LockFreePool() : head(nullptr) {}\n    void* allocate(size_t size) {\n\n        Block* old_head = head.load(std::memory_order_relaxed);\n\n        while (old_head) {\n\n            if (head.compare_exchange_weak(old_head, old_head-&gt;next,\n\n                std::memory_order_acquire, std::memory_order_relaxed)) {\n\n                return old_head;\n\n            }\n\n        }\n\n        return std::aligned_alloc(64, size); \/\/ fallback, 64-byte aligned\n\n    }\n    void deallocate(void* ptr) {\n\n        Block* block = static_cast&lt;Block*&gt;(ptr);\n\n        Block* old_head = head.load(std::memory_order_relaxed);\n\n        do {\n\n            block-&gt;next = old_head;\n\n        } while (!head.compare_exchange_weak(old_head, block,\n\n                 std::memory_order_release, std::memory_order_relaxed));\n\n    }\n\n};\n<\/code><\/pre><\/div><br \/>\n<\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">A CUDA kernel achieves only 30% of peak memory bandwidth on an H100. Walk through debugging it.<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">CUDA \/ Profiling<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Start with Nsight Compute to get a kernel-level profile: achieved occupancy, memory throughput, warp efficiency, and instruction-level breakdown. Then reason through the likely causes in priority order. Uncoalesced memory access is the most common culprit. Bank conflicts in shared memory are second. Thread divergence (branches within a warp) serializes execution and reduces effective throughput. Insufficient parallelism means the GPU has too few active warps to hide memory latency, check that your grid and block dimensions are appropriate for the problem size.<\/p>\n<p>Reported from a senior systems role onsite in 2025. The interviewer wanted to hear Nsight Compute named specifically and wanted the candidate to distinguish between Nsight Systems (timeline, CPU-GPU interaction) and Nsight Compute (kernel internals). Using the wrong tool for the question is a red flag.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Optimize a 70B parameter transformer to reduce inference latency by 50%<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">ML Systems<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Start with INT8 or FP8 quantization for weights and activations where the model&#8217;s accuracy tolerance allows, this cuts both memory bandwidth and compute. Apply kernel fusion via TensorRT or torch.compile to collapse attention and feed-forward layers. Use FlashAttention for the attention layers, which reduces HBM reads and writes for the attention matrix. For the KV cache, PagedAttention (as in vLLM) reduces fragmentation and allows larger effective batch sizes. For very long sequences, speculative decoding with a smaller draft model can improve tokens-per-second at the cost of some implementation complexity.<\/p>\n<p>Reported from a 2025 ML systems onsite. The interviewer asked follow-up questions specifically about the latency-throughput trade-off in each choice, quantization helps latency but can hurt accuracy on certain tasks; larger batches improve throughput but increase per-request latency.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Explain the mixture-of-experts (MoE) architecture and its trade-offs.<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">LLM Systems<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>MoE replaces each dense feed-forward block with multiple specialist sub-networks (&#8220;experts&#8221;), with a gating network routing each token to a subset (typically top-2). Compute per token stays constant even as total parameter count grows, Mixtral 8x7B has 47B total parameters but activates roughly 13B per token. This gives MoE models a favorable FLOPs-per-quality ratio at training time.<\/p>\n<p>Trade-offs: load imbalance across experts (some experts get routed to heavily, others sit idle), which requires auxiliary load-balancing losses during training. Increased communication overhead in distributed training, since experts may live on different devices and tokens need to be routed across the network. Serving complexity increases because some experts may be &#8220;cold&#8221; (not resident in GPU memory) if you&#8217;re serving many adapters on one cluster.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Describe the trade-offs between data parallelism, model parallelism, and pipeline parallelism for large-scale training.<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">LLM Systems<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Data parallelism replicates the full model on each GPU and shards the data. Simple to implement, but requires an all-reduce at each gradient step, as model size grows, this communication becomes the bottleneck. Model parallelism shards the model layers across GPUs, reducing per-GPU memory at the cost of communication for activations between layers. Pipeline parallelism assigns each GPU one stage of the computation and enables asynchronous micro-batching, but introduces pipeline bubbles (GPUs sitting idle waiting for the previous stage) that hurt GPU utilization.<\/p>\n<p>In practice, Nvidia&#8217;s Megatron-LM and Microsoft DeepSpeed use all three simultaneously (3D parallelism), with tensor parallelism within a node (NVLink), pipeline parallelism across nodes (InfiniBand), and data parallelism across replica groups. The optimal split depends on the model architecture and hardware topology.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-dsec iq-dsec--scenario\"><div class=\"iq-dsec__row\"><h2 class=\"iq-dsec__h\" id=\"scenario\"><span class=\"iq-dsec__dot\" aria-hidden=\"true\"><\/span>Real-time scenario questions<\/h2><span class=\"iq-dsec__n\">5<\/span><\/div><div class=\"iq-dsec__bar\" aria-hidden=\"true\"><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Design a data structure supporting O(1) insertion and O(log n) median retrieval for GPU kernel execution times<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">System Design \/ Data Structures<\/span><span class=\"iq-badge iq-badge--medium\">Medium<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Two heaps: a max-heap for the lower half of values, a min-heap for the upper half. On each insertion, add to the appropriate heap based on whether the value is above or below the current median, then rebalance if the two heaps differ in size by more than one. The median is either the top of the larger heap, or the average of both tops if they&#8217;re equal in size.<\/p>\n<p>Reported from a 2025 onsite. The GPU-specific framing, &#8220;kernel execution times arriving in real-time&#8221;, is unusual but the underlying pattern is the classic sliding window median. The insertion is effectively O(log n), not O(1), but the question is testing whether you know this approach at all and can implement it correctly.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Design a GPU resource scheduler for multiple users and workloads<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">System Design<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Model GPU memory and compute as first-class constrained resources, not just CPU slots. Cover preemption strategy (checkpoint-and-restore vs. kill-and-resubmit, the latter being cheaper but harsher), priority queuing with aging to prevent starvation, and gang scheduling for jobs that need multiple GPUs simultaneously, a job requiring 8 GPUs must wait until all 8 are available, or fragment-and-stall becomes a real problem.<\/p>\n<p>Interviewers push hard on the failure case: what happens when a job hangs? You need a watchdog process, a heartbeat from running jobs, and a kill mechanism that releases GPU memory even if the job process is unresponsive (which means you need a separate out-of-process memory manager, not just cleanup in the job itself).<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Design a distributed inference system handling 10,000 RPS with sub-100ms P99 latency across H100s<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">System Design<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Model sharding strategy first: tensor parallelism within a node (using NVLink for high-bandwidth inter-GPU communication), pipeline parallelism across nodes (using InfiniBand). Load balancing must be GPU-memory-aware, not just CPU-load-aware, a node with high CPU but low GPU memory utilization is still a valid target. Request batching with a configurable max wait time (e.g., 5ms) amortizes kernel launch overhead while keeping tail latency bounded.<\/p>\n<p>At senior level, interviewers expect you to name TensorRT-LLM or vLLM as existing solutions and know their trade-offs. TensorRT-LLM has better raw latency for fixed-shape inputs; vLLM has better throughput for variable-length sequences via PagedAttention. Reported from a 2025 onsite.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Design a fault-tolerant distributed training pipeline for a 10B parameter model on 128 H100 GPUs<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">System Design<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Parallelism strategy: tensor parallelism within a node using NVLink (8 GPUs per node), pipeline parallelism across nodes using InfiniBand. Checkpoint frequency is a trade-off: more frequent checkpoints reduce wasted compute on node failure but add synchronization overhead and storage I\/O. With 128 GPUs, a node failure every few hours is realistic, plan for it. NCCL handles gradient reduction. ZeRO-3 optimizer state sharding (from DeepSpeed) spreads the optimizer states, gradients, and parameters across GPUs to fit larger models than any single GPU could hold.<\/p>\n<p>Interviewers want to see that you can reason about the failure probability of 128 machines over a multi-day training run, not just describe the happy path.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-qa\"><button class=\"iq-qa__q\" type=\"button\" aria-expanded=\"false\"><span class=\"iq-qa__qtext\">Design a high-performance caching layer for real-time inference results with sub-millisecond latency<\/span><span class=\"iq-qa__meta\"><span class=\"iq-qa__tag\">System Design<\/span><span class=\"iq-badge iq-badge--hard\">Hard<\/span><span class=\"iq-qa__chev\" aria-hidden=\"true\"><\/span><\/span><\/button><div class=\"iq-qa__a\"><div class=\"iq-qa__a-inner\"><\/p>\n<p>Key design decisions: in-process memory vs. Redis vs. GPU-local caching. For sub-millisecond latency, in-process caching is usually necessary, a Redis round-trip adds 0.5 to 2ms of network latency even on a fast LAN, which violates the constraint. Cache key design for model inputs is hard: exact-match keys work for deterministic inputs, but near-duplicate inputs (semantically similar prompts) won&#8217;t hit. Semantic caching using embedding similarity adds latency that may negate the cache benefit. Eviction policy matters: LRU works well for temporal locality in request patterns; LFU works better for long-tail distributions where some inputs recur at very high frequency.<\/p>\n<p>Invalidation when model weights update requires either a versioned cache key (include model version in the key) or a cache flush, the versioned approach is better for gradual rollouts.<\/p>\n<p><\/div><\/div><\/div>\n<div class=\"iq-callout iq-callout--insight not-prose\"><div class=\"iq-callout__title\">What we&#039;ve seen across Nvidia loops<\/div><div class=\"iq-callout__body\"><\/p>\n<p>Candidates who prep for Nvidia onsites through LastRoundAI&#8217;s mock interview sessions show a consistent failure pattern that doesn&#8217;t appear in standard prep guides. The failure mode that ends most Nvidia loops early isn&#8217;t coding ability, it&#8217;s the inability to reason out loud about why a solution is right, not just that it is.<\/p>\n<p>Nvidia interviewers probe your confidence on follow-ups more than most companies. A correct LRU cache implementation followed by a fumbled &#8220;why would you make this thread-safe?&#8221; costs you the round. The candidates who get through consistently treat every follow-up as a chance to show depth, not an attack on their first answer.<\/p>\n<p>For GPU and systems roles specifically: interviewers expect you to connect algorithm choices to hardware realities. &#8220;I&#8217;d use a hash map here because O(1) lookup&#8221; is a weaker answer at Nvidia than &#8220;I&#8217;d use a hash map here because the lookup bottleneck in this GPU pipeline is on the critical path between kernel launches, so we need deterministic constant-time access.&#8221; Same data structure. Very different signal.<\/p>\n<p>The second pattern: Nvidia&#8217;s behavioral round is more technically substantive than behavioral rounds at Amazon or Google. The &#8220;One Team&#8221; questions look soft but they often loop back to technical decisions. Prepare your behavioral stories with the same technical depth as your system design stories.<\/p>\n<p><\/div><\/div>\n<div class=\"iq-callout iq-callout--tip not-prose\"><div class=\"iq-callout__title\">On the follow-up questions<\/div><div class=\"iq-callout__body\"><\/p>\n<p>The recruiter wasn&#8217;t wrong that Nvidia isn&#8217;t a LeetCode shop. But &#8220;isn&#8217;t a LeetCode shop&#8221; doesn&#8217;t mean the coding problems are easy, it means the follow-up questions matter as much as the initial solution. Budget 40% of your prep time for practicing out-loud explanation of your solutions, not just solving more problems silently.<\/p>\n<p><\/div><\/div>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How long does the Nvidia interview process take from application to offer?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Most candidates report 4 to 8 weeks from application to verbal offer. Referrals sometimes compress this to 3 to 4 weeks. The longest wait is usually between the onsite completion and the team-matching calls, which can take 1 to 2 weeks.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Do Nvidia coding interviews focus on hard LeetCode problems?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Mostly medium difficulty. A handful of reported questions are hard (Special Binary String, Basic Calculator III), but the median is medium. Nvidia emphasizes follow-up questions and reasoning behind your solution over raw problem difficulty.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Do I need CUDA experience to get a software engineering role at Nvidia?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"It depends on the team. GPU architecture, CUDA platform, driver, and compiler roles require real CUDA hands-on experience. Application-layer SWE roles ask lighter, more conceptual GPU questions. Ask your recruiter which category your loop falls into.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What does the new grad Nvidia interview look like?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"New grads start with a HackerRank online assessment: 2 to 3 coding problems and 25 multiple-choice questions covering C\/C++ fundamentals, OS, DSA, and probability in 70 to 90 minutes. Candidates who pass get a recruiter call, then 3 to 4 technical and behavioral rounds.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How important is C++ for Nvidia interviews?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Very important for systems and GPU roles. Interviewers go deep on memory management, RAII, virtual dispatch, threading primitives, and template mechanics. For any role with 'systems,' 'compiler,' 'driver,' or 'CUDA' in the title, C++ fluency is effectively a prerequisite.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does Nvidia ask system design questions for new grads?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Usually not in full. New grad loops focus on coding and conceptual questions. Senior and staff level loops include a dedicated 60-minute system design round. Mid-level varies by team.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<div class=\"iq-related not-prose\"><div class=\"iq-related__title\">Related interview guides<\/div><div class=\"iq-related__grid\"><a class=\"iq-rel__card\" href=\"https:\/\/lastroundai.com\/interview-questions\/openai\"><span class=\"iq-rel__t\">OpenAI Interview Questions (2026): What They Actually Ask<\/span><span class=\"iq-rel__arrow\" aria-hidden=\"true\">&rarr;<\/span><\/a><a class=\"iq-rel__card\" href=\"https:\/\/lastroundai.com\/interview-questions\/amazon-sde-2\"><span class=\"iq-rel__t\">Amazon SDE-2 Interview Questions (2026): What They Actually Ask<\/span><span class=\"iq-rel__arrow\" aria-hidden=\"true\">&rarr;<\/span><\/a><a class=\"iq-rel__card\" href=\"https:\/\/lastroundai.com\/interview-questions\/google-l4\"><span class=\"iq-rel__t\">Google L4 Interview Questions (2026): What They Actually Ask<\/span><span class=\"iq-rel__arrow\" aria-hidden=\"true\">&rarr;<\/span><\/a><a class=\"iq-rel__card\" href=\"https:\/\/lastroundai.com\/interview-questions\/meta-e5\"><span class=\"iq-rel__t\">Meta E5 Interview Questions (2026): What They Actually Ask<\/span><span class=\"iq-rel__arrow\" aria-hidden=\"true\">&rarr;<\/span><\/a><a class=\"iq-rel__card\" href=\"https:\/\/lastroundai.com\/interview-questions\/system-design\"><span class=\"iq-rel__t\">System Design Interview Questions (2026): Must-Know Q&#038;A<\/span><span class=\"iq-rel__arrow\" aria-hidden=\"true\">&rarr;<\/span><\/a><a class=\"iq-rel__card\" href=\"https:\/\/lastroundai.com\/interview-questions\/tcs\"><span class=\"iq-rel__t\">TCS Interview Questions (2026): NQT, Technical, MR &#038; HR Rounds<\/span><span class=\"iq-rel__arrow\" aria-hidden=\"true\">&rarr;<\/span><\/a><\/div><\/div>\n<div class=\"iq-sources not-prose\"><div class=\"iq-sources__title\">Sources &amp; further reading<\/div><ul class=\"iq-sources__list\"><li><a href=\"https:\/\/interviewing.io\/guides\/hiring-process\/nvidia\" target=\"_blank\" rel=\"nofollow noopener\">interviewing.io<\/a><\/li><li><a href=\"https:\/\/www.glassdoor.com\/Interview\/NVIDIA-Interview-Questions-E7633.htm\" target=\"_blank\" rel=\"nofollow noopener\">Glassdoor<\/a><\/li><li><a href=\"https:\/\/www.levels.fyi\/companies\/nvidia\/salaries\/software-engineer\" target=\"_blank\" rel=\"nofollow noopener\">Levels.fyi<\/a><\/li><li><a href=\"https:\/\/www.finalroundai.com\/blog\/nvidia-interview-questions\" target=\"_blank\" rel=\"nofollow noopener\">FinalRoundAI<\/a><\/li><li><a href=\"https:\/\/www.geeksforgeeks.org\/nvidia-interview-experience\/\" target=\"_blank\" rel=\"nofollow noopener\">GeeksForGeeks<\/a><\/li><\/ul><\/div>\n","protected":false},"excerpt":{"rendered":"<p>When a candidate at a mid-size ML infrastructure team applied for a senior systems role at Nvidia in late 2024, the recruiter told him upfront: &#8220;This isn&#8217;t a LeetCode shop. We care a lot more about what you actually know than whether you can implement Dijkstra in 20 minutes.&#8221; He still had to solve two&#8230;<\/p>\n","protected":false},"author":4,"featured_media":1738,"comment_status":"open","ping_status":"closed","template":"","meta":{"_kad_post_transparent":"","_kad_post_title":"","_kad_post_layout":"","_kad_post_sidebar_id":"","_kad_post_content_style":"","_kad_post_vertical_padding":"","_kad_post_feature":"","_kad_post_feature_position":"","_kad_post_header":false,"_kad_post_footer":false,"_kad_post_classname":"","footnotes":""},"tags":[],"class_list":["post-943","iq","type-iq","status-publish","has-post-thumbnail","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.8 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Nvidia Interview Questions (2026) | LastRoundAI<\/title>\n<meta name=\"description\" content=\"Real Nvidia interview questions for 2026: coding, CUDA\/GPU, system design, and behavioral rounds. Based on verified candidate reports, not guesswork.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/lastroundai.com\/interview-questions\/nvidia\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Nvidia Interview Questions (2026) | LastRoundAI\" \/>\n<meta property=\"og:description\" content=\"Real Nvidia interview questions for 2026: coding, CUDA\/GPU, system design, and behavioral rounds. Based on verified candidate reports, not guesswork.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/lastroundai.com\/interview-questions\/nvidia\" \/>\n<meta property=\"og:site_name\" content=\"LastRound AI\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-19T03:53:29+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/07\/iq-nvidia-og.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"630\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"28 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/nvidia\",\"url\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/nvidia\",\"name\":\"Nvidia Interview Questions (2026) | LastRoundAI\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/nvidia#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/nvidia#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/iq-nvidia-og.png\",\"datePublished\":\"2026-06-20T10:54:49+00:00\",\"dateModified\":\"2026-07-19T03:53:29+00:00\",\"description\":\"Real Nvidia interview questions for 2026: coding, CUDA\\\/GPU, system design, and behavioral rounds. Based on verified candidate reports, not guesswork.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/nvidia#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/nvidia\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/nvidia#primaryimage\",\"url\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/iq-nvidia-og.png\",\"contentUrl\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/07\\\/iq-nvidia-og.png\",\"width\":1200,\"height\":630,\"caption\":\"Nvidia interview questions \u2014 LastRoundAI\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\\\/nvidia#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/lastroundai.com\\\/blog\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Interview Questions\",\"item\":\"https:\\\/\\\/lastroundai.com\\\/interview-questions\"},{\"@type\":\"ListItem\",\"position\":3,\"name\":\"Nvidia Interview Questions (2026): What They Actually Ask\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/\",\"name\":\"LastRound AI\",\"description\":\"Interview Assistant prep, tech careers and AI tools\",\"publisher\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#organization\",\"name\":\"LastRound AI\",\"url\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/lastroundai-transprant-logo-optimized-BxEo2Wtq.png\",\"contentUrl\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/wp-content\\\/uploads\\\/2026\\\/06\\\/lastroundai-transprant-logo-optimized-BxEo2Wtq.png\",\"width\":400,\"height\":400,\"caption\":\"LastRound AI\"},\"image\":{\"@id\":\"https:\\\/\\\/lastroundai.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Nvidia Interview Questions (2026) | LastRoundAI","description":"Real Nvidia interview questions for 2026: coding, CUDA\/GPU, system design, and behavioral rounds. Based on verified candidate reports, not guesswork.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/lastroundai.com\/interview-questions\/nvidia","og_locale":"en_US","og_type":"article","og_title":"Nvidia Interview Questions (2026) | LastRoundAI","og_description":"Real Nvidia interview questions for 2026: coding, CUDA\/GPU, system design, and behavioral rounds. Based on verified candidate reports, not guesswork.","og_url":"https:\/\/lastroundai.com\/interview-questions\/nvidia","og_site_name":"LastRound AI","article_modified_time":"2026-07-19T03:53:29+00:00","og_image":[{"width":1200,"height":630,"url":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/07\/iq-nvidia-og.png","type":"image\/png"}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"28 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/lastroundai.com\/interview-questions\/nvidia","url":"https:\/\/lastroundai.com\/interview-questions\/nvidia","name":"Nvidia Interview Questions (2026) | LastRoundAI","isPartOf":{"@id":"https:\/\/lastroundai.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/lastroundai.com\/interview-questions\/nvidia#primaryimage"},"image":{"@id":"https:\/\/lastroundai.com\/interview-questions\/nvidia#primaryimage"},"thumbnailUrl":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/07\/iq-nvidia-og.png","datePublished":"2026-06-20T10:54:49+00:00","dateModified":"2026-07-19T03:53:29+00:00","description":"Real Nvidia interview questions for 2026: coding, CUDA\/GPU, system design, and behavioral rounds. Based on verified candidate reports, not guesswork.","breadcrumb":{"@id":"https:\/\/lastroundai.com\/interview-questions\/nvidia#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/lastroundai.com\/interview-questions\/nvidia"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/lastroundai.com\/interview-questions\/nvidia#primaryimage","url":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/07\/iq-nvidia-og.png","contentUrl":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/07\/iq-nvidia-og.png","width":1200,"height":630,"caption":"Nvidia interview questions \u2014 LastRoundAI"},{"@type":"BreadcrumbList","@id":"https:\/\/lastroundai.com\/interview-questions\/nvidia#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/lastroundai.com\/blog"},{"@type":"ListItem","position":2,"name":"Interview Questions","item":"https:\/\/lastroundai.com\/interview-questions"},{"@type":"ListItem","position":3,"name":"Nvidia Interview Questions (2026): What They Actually Ask"}]},{"@type":"WebSite","@id":"https:\/\/lastroundai.com\/blog\/#website","url":"https:\/\/lastroundai.com\/blog\/","name":"LastRound AI","description":"Interview Assistant prep, tech careers and AI tools","publisher":{"@id":"https:\/\/lastroundai.com\/blog\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/lastroundai.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/lastroundai.com\/blog\/#organization","name":"LastRound AI","url":"https:\/\/lastroundai.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/lastroundai.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/06\/lastroundai-transprant-logo-optimized-BxEo2Wtq.png","contentUrl":"https:\/\/lastroundai.com\/blog\/wp-content\/uploads\/2026\/06\/lastroundai-transprant-logo-optimized-BxEo2Wtq.png","width":400,"height":400,"caption":"LastRound AI"},"image":{"@id":"https:\/\/lastroundai.com\/blog\/#\/schema\/logo\/image\/"}}]}},"_links":{"self":[{"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/iq\/943","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/iq"}],"about":[{"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/types\/iq"}],"author":[{"embeddable":true,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/comments?post=943"}],"version-history":[{"count":6,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/iq\/943\/revisions"}],"predecessor-version":[{"id":1480,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/iq\/943\/revisions\/1480"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/media\/1738"}],"wp:attachment":[{"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/media?parent=943"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/lastroundai.com\/blog\/wp-json\/wp\/v2\/tags?post=943"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}