在线观看www成人影院-在线观看www日本免费网站-在线观看www视频-在线观看操-欧美18在线-欧美1级

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

使用NVIDIA CUDA流順序內(nèi)存分配器

星星科技指導(dǎo)員 ? 來(lái)源:NVIDIA ? 作者:NVIDIA ? 2022-04-21 15:39 ? 次閱讀

大多數(shù) CUDA 開(kāi)發(fā)人員都熟悉 cudaMalloc 和 cudaFree API 函數(shù)來(lái)分配 GPU 可訪問(wèn)內(nèi)存。然而,這些 API 函數(shù)長(zhǎng)期以來(lái)一直存在一個(gè)障礙:它們不是按流排序的。在本文中,我們將介紹新的 API 函數(shù) cudaMallocAsync 和 cudaFreeAsync ,它們使內(nèi)存分配和釋放成為流式有序操作。

在 本系列的第 2 部分 中,我們通過(guò)共享一些大數(shù)據(jù)基準(zhǔn)測(cè)試結(jié)果來(lái)強(qiáng)調(diào)這一新功能的好處,并為修改現(xiàn)有應(yīng)用程序提供代碼 MIG 定量指南。我們還介紹了在多 GPU 訪問(wèn)和 IPC 使用環(huán)境中利用流順序內(nèi)存分配的高級(jí)主題。這一切都有助于提高現(xiàn)有應(yīng)用程序的性能。

流排序效率

下面左邊的代碼示例效率低下,因?yàn)榈谝粋€(gè) cudaFree 調(diào)用必須等待 kernelA 完成,所以它會(huì)在釋放內(nèi)存之前同步設(shè)備。為了提高運(yùn)行效率,可以預(yù)先分配內(nèi)存,并將其調(diào)整為兩種大小中的較大值,如右圖所示。

cudaMalloc(&ptrA, sizeA);
kernelA<<<..., stream>>>(ptrA);
cudaFree(ptrA); // Synchronizes the
device before freeing memory
cudaMalloc(&ptrB, sizeB);
kernelB<<<..., stream>>>(ptrB);
cudaFree(ptrB);
cudaMalloc(&ptr,   max(sizeA, sizeB));
kernelA<<<...,   stream>>>(ptr);
kernelB<<<...,   stream>>>(ptr);
cudaFree(ptr); 

這增加了應(yīng)用程序中的代碼復(fù)雜性,因?yàn)閮?nèi)存管理代碼與業(yè)務(wù)邏輯分離。當(dāng)涉及到其他圖書(shū)館時(shí),問(wèn)題就更加嚴(yán)重了。例如,考慮kernelA由庫(kù)函數(shù)啟動(dòng)的情況,而不是:

libraryFuncA(stream);
cudaMalloc(&ptrB, sizeB);
kernelB<<<..., stream>>>(ptrB);
cudaFree(ptrB);
  
void libraryFuncA(cudaStream_t stream) {
    cudaMalloc(&ptrA, sizeA);
    kernelA<<<..., stream>>>(ptrA);
    cudaFree(ptrA);
 } 

這對(duì)于應(yīng)用程序來(lái)說(shuō)要提高效率要困難得多,因?yàn)樗赡軣o(wú)法完全查看或控制庫(kù)正在執(zhí)行的操作。為了避免這個(gè)問(wèn)題,庫(kù)必須在第一次調(diào)用該函數(shù)時(shí)分配內(nèi)存,并且在庫(kù)被取消初始化之前永遠(yuǎn)不會(huì)釋放內(nèi)存。這不僅增加了代碼的復(fù)雜性,而且還會(huì)導(dǎo)致庫(kù)占用內(nèi)存的時(shí)間超過(guò)需要的時(shí)間,從而可能會(huì)阻止應(yīng)用程序的另一部分使用該內(nèi)存。

有些應(yīng)用程序通過(guò)實(shí)現(xiàn)自己的自定義分配器,進(jìn)一步提前分配內(nèi)存。這為應(yīng)用程序開(kāi)發(fā)增加了大量復(fù)雜性。 CUDA 旨在提供一種低工作量、高性能的替代方案。

CUDA 11 。 2 引入了流式有序內(nèi)存分配器來(lái)解決這些類型的問(wèn)題,并添加了 cudaMallocAsync 和 cudaFreeAsync 。這些新的 API 函數(shù)將內(nèi)存分配從同步整個(gè)設(shè)備的全局作用域操作轉(zhuǎn)移到流順序操作,從而使您能夠?qū)?nèi)存管理與 GPU 工作提交結(jié)合起來(lái)。這消除了同步未完成 GPU 工作的需要,并有助于將分配的生命周期限制為訪問(wèn)它的 GPU 工作。考慮下面的代碼示例:

cudaMallocAsync(&ptrA, sizeA, stream);
kernelA<<<..., stream>>>(ptrA);
cudaFreeAsync(ptrA, stream); // No synchronization necessary
cudaMallocAsync(&ptrB, sizeB, stream); // Can reuse the memory freed previously
kernelB<<<..., stream>>>(ptrB);
cudaFreeAsync(ptrB, stream); 

現(xiàn)在可以在函數(shù)范圍內(nèi)管理內(nèi)存,如下面啟動(dòng)kernelA的庫(kù)函數(shù)示例所示。

libraryFuncA(stream);
cudaMallocAsync(&ptrB, sizeB, stream); // Can reuse the memory freed by the library call
kernelB<<<..., stream>>>(ptrB);
cudaFreeAsync(ptrB, stream);
  
void libraryFuncA(cudaStream_t stream) {
    cudaMallocAsync(&ptrA, sizeA, stream);
    kernelA<<<..., stream>>>(ptrA);
    cudaFreeAsync(ptrA, stream); // No synchronization necessary
} 

流有序分配語(yǔ)義

所有常用的流排序規(guī)則都適用于 cudaMallocAsync 和 cudaFreeAsync 。從 cudaMallocAsync 返回的內(nèi)存可以被任何內(nèi)核或 memcpy 操作訪問(wèn),只要內(nèi)核或 memcpy 被命令在分配操作之后和解除分配操作之前以流順序執(zhí)行。解除分配可以在任何流中執(zhí)行,只要命令在分配操作之后以及在 GPU 上對(duì)該內(nèi)存的所有流進(jìn)行所有訪問(wèn)之后執(zhí)行。

實(shí)際上,流順序分配的行為就像分配和自由是內(nèi)核一樣。如果 kernelA 在流上生成有效緩沖區(qū),并且 kernelB 在同一流上使其無(wú)效,則應(yīng)用程序可以按照適當(dāng)?shù)牧黜樞蛟?kernelA 之后和 kernelB 之前自由訪問(wèn)緩沖區(qū)。

下面的示例顯示了各種有效用法。

auto err = cudaMallocAsync(&ptr, size, streamA);
// If cudaMallocAsync completes successfully, ptr is guaranteed to be
// a valid pointer to memory that can be accessed in stream order
  
assert(err == cudaSuccess);
  
// Work launched in the same stream can access the memory because
// operations within a stream are serialized by definition
  
kernel<<<..., streamA>>>(ptr);
  
// Work launched in another stream can access the memory as long as
// the appropriate dependencies are added
  
cudaEventRecord(event, streamA);
cudaStreamWaitEvent(streamB, event, 0);
kernel<<<..., streamB>>>(ptr);


// Synchronizing the stream at a point beyond the allocation operation
// also enables any stream to access the memory
  
cudaEventSynchronize(event);
kernel<<<..., streamC>>>(ptr);
  
// Deallocation requires joining all the accessing streams. Here,
// streamD will be deallocating.
// Adding an event dependency on streamB ensures that all accesses in
// streamB will be done before the deallocation
  
cudaEventRecord(event, streamB);
cudaStreamWaitEvent(streamD, event, 0);
  
// Synchronizing streamC also ensures that all its accesses are done before
// the deallocation
  
cudaStreamSynchronize(streamC);
cudaFreeAsync(ptr, streamD); 

圖 1 顯示了在前面的代碼示例中指定的各種依賴關(guān)系。如您所見(jiàn),所有內(nèi)核都被命令在分配操作之后執(zhí)行,并在釋放操作之前完成。

Figure showing how to correctly access memory allocated using cudaMallocAsync.

圖 1 在流之間插入依賴關(guān)系的各種方法,以確保訪問(wèn)使用 cudaMallocAsync.

內(nèi)存分配和釋放不能異步失敗。由于調(diào)用 cudaMallocAsync 或 cudaFreeAsync (例如,內(nèi)存不足)而發(fā)生的內(nèi)存錯(cuò)誤會(huì)通過(guò)調(diào)用返回的錯(cuò)誤代碼立即報(bào)告。如果 cudaMallocAsync 成功完成,則返回的指針將保證是指向內(nèi)存的有效指針,可以按照適當(dāng)?shù)牧黜樞虬踩L問(wèn)。

err = cudaMallocAsync(&ptr, size, stream);
if (err != cudaSuccess) {
    return err;
}
// Now you’re guaranteed that ‘ptr’ is valid when the kernel executes on stream
kernel<<<..., stream>>>(ptr);
cudaFreeAsync(ptr, stream); 

CUDA 驅(qū)動(dòng)程序使用內(nèi)存池實(shí)現(xiàn)立即返回指針的行為。

內(nèi)存池

流順序內(nèi)存分配器將 存儲(chǔ)池 的概念引入 CUDA 。內(nèi)存池是以前分配的內(nèi)存的集合,可以重新用于將來(lái)的分配。在 CUDA 中,池由 cudaMemPool_t 句柄表示。每個(gè)設(shè)備都有一個(gè)默認(rèn)池的概念,可以使用 cudaDeviceGetDefaultMemPool 查詢其句柄。

您還可以顯式創(chuàng)建自己的池,直接使用它們,或者將它們?cè)O(shè)置為設(shè)備的當(dāng)前池,并間接使用它們。創(chuàng)建顯式池的原因包括自定義配置,如本文后面所述。當(dāng)沒(méi)有顯式創(chuàng)建的池被設(shè)置為設(shè)備的當(dāng)前池時(shí),默認(rèn)池將充當(dāng)當(dāng)前池。

在沒(méi)有顯式池參數(shù)的情況下調(diào)用 cudaMallocAsync 時(shí),每次調(diào)用都會(huì)從指定的流推斷設(shè)備,并嘗試從該設(shè)備的當(dāng)前池分配內(nèi)存。如果池內(nèi)存不足, CUDA 驅(qū)動(dòng)程序?qū)⒄{(diào)用操作系統(tǒng)以分配更多內(nèi)存。對(duì) cudaFreeAsync 的每次調(diào)用都會(huì)將內(nèi)存返回到池中,然后可在后續(xù) cudaMallocAsync 請(qǐng)求中重新使用該內(nèi)存。池由 CUDA 驅(qū)動(dòng)程序管理,這意味著應(yīng)用程序可以在多個(gè)庫(kù)之間實(shí)現(xiàn)池共享,而無(wú)需這些庫(kù)相互協(xié)調(diào)。

如果使用 cudaMallocAsync 發(fā)出的內(nèi)存分配請(qǐng)求由于相應(yīng)內(nèi)存池的碎片而無(wú)法提供服務(wù), CUDA 驅(qū)動(dòng)程序通過(guò)將池中未使用的內(nèi)存重新映射到 GPU 虛擬地址空間的連續(xù)部分來(lái)對(duì)池進(jìn)行碎片整理。重新映射現(xiàn)有池內(nèi)存而不是從操作系統(tǒng)分配新內(nèi)存也有助于降低應(yīng)用程序的內(nèi)存占用。

默認(rèn)情況下,在事件、流或設(shè)備上的下一次同步操作期間,池中累積的未使用內(nèi)存將返回到操作系統(tǒng),如下面的代碼示例所示。

cudaMallocAsync(ptr1, size1, stream); // Allocates new memory into the pool
kernel<<<..., stream>>>(ptr);
cudaFreeAsync(ptr1, stream); // Frees memory back to the pool
cudaMallocAsync(ptr2, size2, stream); // Allocates existing memory from the pool
kernel<<<..., stream>>>(ptr2);
cudaFreeAsync(ptr2, stream); // Frees memory back to the pool
cudaDeviceSynchronize(); // Frees unused memory accumulated in the pool back to the OS
// Note: cudaStreamSynchronize(stream) achieves the same effect here 

在池中保留內(nèi)存

在某些情況下,將內(nèi)存從池返回到系統(tǒng)可能會(huì)影響性能。考慮下面的代碼示例:

for (int i = 0; i < 100; i++) {
    cudaMallocAsync(&ptr, size, stream);
    kernel<<<..., stream>>>(ptr);
    cudaFreeAsync(ptr, stream);
    cudaStreamSynchronize(stream);
}

默認(rèn)情況下,流同步會(huì)導(dǎo)致與該流的設(shè)備關(guān)聯(lián)的任何池將所有未使用的內(nèi)存釋放回系統(tǒng)。在本例中,這將在每次迭代結(jié)束時(shí)發(fā)生。因此,沒(méi)有內(nèi)存可供下次 cudaMallocAsync 調(diào)用重用,而必須通過(guò)昂貴的系統(tǒng)調(diào)用來(lái)分配內(nèi)存。

為了避免這種昂貴的重新分配,應(yīng)用程序可以配置一個(gè)釋放閾值,以使未使用的內(nèi)存在同步操作之后保持不變。釋放閾值指定池緩存的最大內(nèi)存量。在同步操作期間,它會(huì)將所有多余的內(nèi)存釋放回操作系統(tǒng)。

默認(rèn)情況下,池的釋放閾值為零。這意味著池中使用的內(nèi)存在每次同步操作期間都會(huì)釋放回操作系統(tǒng)。下面的代碼示例演示如何更改釋放閾值。

cudaMemPool_t mempool;
cudaDeviceGetDefaultMemPool(&mempool, device);
uint64_t threshold = UINT64_MAX;
cudaMemPoolSetAttribute(mempool, cudaMemPoolAttrReleaseThreshold, &threshold);
for (int i = 0; i < 100; i++) {
    cudaMallocAsync(&ptr, size, stream);
    kernel<<<..., stream>>>(ptr);
    cudaFreeAsync(ptr, stream);
    cudaStreamSynchronize(stream);    // Only releases memory down to “threshold” bytes
} 

使用非零釋放閾值可以從一個(gè)迭代到下一個(gè)迭代重用內(nèi)存。這只需要簡(jiǎn)單的簿記,并使 cudaMallocAsync 的性能獨(dú)立于分配的大小,從而顯著提高了內(nèi)存分配性能(圖 2 )。

Figure showing differences in cost of memory allocation with and without a release threshold.

圖 2 使用 cudaMallocAsync 設(shè)置和不設(shè)置釋放閾值(與 0 。 4MB 性能相關(guān)的所有值,閾值分配) 。

池閾值只是一個(gè)提示。在相同的內(nèi)存池中[0]可以隱式釋放內(nèi)存分配,以使內(nèi)存分配成功。例如,對(duì) cudaMalloc 或 cuMemCreate 的調(diào)用可能會(huì)導(dǎo)致 CUDA 從與同一進(jìn)程中的設(shè)備關(guān)聯(lián)的任何內(nèi)存池中釋放未使用的內(nèi)存來(lái)為請(qǐng)求提供服務(wù)

這在應(yīng)用程序使用多個(gè)庫(kù)的情況下尤其有用,其中一些庫(kù)使用 cudaMallocAsync ,而另一些庫(kù)不使用 cudaMallocAsync 。通過(guò)自動(dòng)釋放未使用的池內(nèi)存,這些庫(kù)不必相互協(xié)調(diào)以使各自的分配請(qǐng)求成功。

CUDA 驅(qū)動(dòng)程序自動(dòng)將內(nèi)存從池重新分配給不相關(guān)的分配請(qǐng)求時(shí)存在限制。例如,應(yīng)用程序可能使用不同的接口(如 Vulkan 或 DirectX )來(lái)訪問(wèn) GPU ,或者可能有多個(gè)進(jìn)程同時(shí)使用 GPU 。這些上下文中的內(nèi)存分配請(qǐng)求不會(huì)自動(dòng)釋放未使用的池內(nèi)存。在這種情況下,應(yīng)用程序可能必須通過(guò)調(diào)用 cudaMemPoolTrimTo 顯式釋放池中未使用的內(nèi)存。

size_t bytesToKeep = 0;
cudaMemPoolTrimTo(mempool, bytesToKeep); 

bytesToKeep 參數(shù)告訴 CUDA 驅(qū)動(dòng)程序它可以在池中保留多少字節(jié)。任何超過(guò)該大小的未使用內(nèi)存都會(huì)釋放回操作系統(tǒng)。

通過(guò)內(nèi)存重用提高性能

cudaMallocAsync 和 cudaFreeAsync 的 stream 參數(shù)有助于 CUDA 高效地重用內(nèi)存,避免對(duì)操作系統(tǒng)進(jìn)行昂貴的調(diào)用。考慮下面的瑣碎代碼示例。

cudaMallocAsync(&ptr1, size1, stream);
kernelA<<<..., stream>>>(ptr1);
cudaFreeAsync(ptr1, stream);
cudaMallocAsync(&ptr2, size2, stream);
kernelB<<<..., stream>>>(ptr2); 

Figure showing how memory can be reused within a stream.

圖 3 同一流中的內(nèi)存重用 。

在這個(gè)代碼示例中, ptr2 是在 ptr1 被釋放后按流順序分配的。 ptr2 分配可以重用用于 ptr1 的部分或全部?jī)?nèi)存,而無(wú)需任何同步,因?yàn)?kernelA 和 kernelB 在同一個(gè)流中啟動(dòng)。因此,流排序語(yǔ)義保證 kernelB 在 kernelA 完成之前不能開(kāi)始執(zhí)行和訪問(wèn)內(nèi)存。通過(guò)這種方式, CUDA 驅(qū)動(dòng)程序可以幫助降低應(yīng)用程序的內(nèi)存占用,同時(shí)提高分配性能。

CUDA 驅(qū)動(dòng)程序還可以跟蹤通過(guò) CUDA 事件插入的流之間的依賴關(guān)系,如以下代碼示例所示:

cudaMallocAsync(&ptr1, size1, streamA);
kernelA<<<..., streamA>>>(ptr1);
cudaFreeAsync(ptr1, streamA);
cudaEventRecord(event, streamA);
cudaStreamWaitEvent(streamB, event, 0);
cudaMallocAsync(&ptr2, size2, streamB);
kernelB<<<..., streamB>>>(ptr2); 

Figure showing how memory can be reused across dependent streams.

圖 4 跨流的內(nèi)存重用,它們之間有事件依賴關(guān)系 。

由于 CUDA 驅(qū)動(dòng)程序知道流 A 和 B 之間的依賴關(guān)系,因此它可以重用 ptr1 為 ptr2 使用的內(nèi)存。流 A 和 B 之間的依賴關(guān)系鏈可以包含任意數(shù)量的流,如下面的代碼示例所示。

cudaMallocAsync(&ptr1, size1, streamA);
kernelA<<<..., streamA>>>(ptr1);
cudaFreeAsync(ptr1, streamA);
cudaEventRecord(event, streamA);
for (int i = 0; i < 100; i++) {
    cudaStreamWaitEvent(streams[i], event, 0);       // streams[] is a previously created array of streams
    cudaEventRecord(event, streams[i]);
}
cudaStreamWaitEvent(streamB, event, 0);
cudaMallocAsync(&ptr2, size2, streamB);
kernelB<<<..., streamB>>>(ptr2); 

如有必要,應(yīng)用程序可以基于每個(gè)池禁用此功能:

int enable = 0;
cudaMemPoolSetAttribute(mempool, cudaMemPoolReuseFollowEventDependencies, &enable); 

CUDA 驅(qū)動(dòng)程序還可以在沒(méi)有應(yīng)用程序指定的顯式依賴項(xiàng)的情況下,有機(jī)會(huì)重用內(nèi)存。雖然這種啟發(fā)式方法可能有助于提高性能或避免內(nèi)存分配失敗,但它們會(huì)給應(yīng)用程序增加不確定性,因此可以在每個(gè)池的基礎(chǔ)上禁用。考慮下面的代碼示例:

cudaMallocAsync(&ptr1, size1, streamA);
kernelA<<<..., streamA>>>(ptr1);
cudaFreeAsync(ptr1);
cudaMallocAsync(&ptr2, size2, streamB);
kernelB<<<..., streamB>>>(ptr2);
cudaFreeAsync(ptr2); 

在此場(chǎng)景中, streamA 和 streamB 之間沒(méi)有明確的依賴關(guān)系。但是, CUDA 驅(qū)動(dòng)程序知道每個(gè)流執(zhí)行了多遠(yuǎn)。如果在第二次調(diào)用 streamB 中的 cudaMallocAsync 時(shí), CUDA 驅(qū)動(dòng)程序確定 kernelA 已在 GPU 上完成執(zhí)行,則它可以重用 ptr1 用于 ptr2 的部分或全部?jī)?nèi)存。

Figure showing how memory can be reused opportunistically across streams.

圖 5 跨流的機(jī)會(huì)主義內(nèi)存重用。

如果 kernelA 尚未完成執(zhí)行, CUDA 驅(qū)動(dòng)程序可以在兩個(gè)流之間添加隱式依賴項(xiàng),以便 kernelB 在 kernelA 完成之前不會(huì)開(kāi)始執(zhí)行。

Figure showing how memory can be reused across streams through implicit dependencies added by the CUDA driver.

圖 6 通過(guò)內(nèi)部依賴關(guān)系重用內(nèi)存 。

應(yīng)用程序可以按如下方式禁用這些啟發(fā)式:

int enable = 0;
cudaMemPoolSetAttribute(mempool, cudaMemPoolReuseAllowOpportunistic, &enable);
cudaMemPoolSetAttribute(mempool, cudaMemPoolReuseAllowInternalDependencies, &enable); 

概括

在本系列的第 1 部分中,我們介紹了新的 API 函數(shù) cudaMallocAsync 和 cudaFreeAsync ,這兩個(gè)函數(shù)使內(nèi)存分配和釋放成為流順序操作。使用它們可以避免通過(guò) CUDA 驅(qū)動(dòng)程序維護(hù)的內(nèi)存池對(duì)操作系統(tǒng)進(jìn)行昂貴的調(diào)用。

在 本系列的第 2 部分 中,我們分享了一些基準(zhǔn)測(cè)試結(jié)果,以展示流順序內(nèi)存分配的好處。我們還提供了一個(gè)逐步修改現(xiàn)有應(yīng)用程序的方法,以充分利用此高級(jí) CUDA 功能。

關(guān)于作者

Vivek Kini 是 NVIDIA 的高級(jí)系統(tǒng)軟件工程師。他致力于 CUDA 驅(qū)動(dòng)程序,特別關(guān)注內(nèi)存管理功能。他旨在簡(jiǎn)化 CUDA 應(yīng)用程序的內(nèi)存管理,而不犧牲它們所需的性能。

Jake Hemstad 是一個(gè)高級(jí)開(kāi)發(fā)工程師 NVIDIA ,他在開(kāi)發(fā)高性能 CUDA C ++軟件加速數(shù)據(jù)分析。他同樣關(guān)心開(kāi)發(fā)高質(zhì)量的軟件,正如他實(shí)現(xiàn)最佳的 GPU 性能一樣,也是現(xiàn)代 C ++設(shè)計(jì)的倡導(dǎo)者。在 NVIDIA 之前,他參加了明尼蘇達(dá)大學(xué)的研究生院,在那里他與桑迪亞國(guó)家實(shí)驗(yàn)室在任務(wù)并行 HPC 運(yùn)行時(shí)間和稀疏線性求解器上工作。

審核編輯:郭婷

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • NVIDIA
    +關(guān)注

    關(guān)注

    14

    文章

    5197

    瀏覽量

    105542
  • CUDA
    +關(guān)注

    關(guān)注

    0

    文章

    122

    瀏覽量

    14022
收藏 人收藏

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    PS2-88,PS2-88/NF功率分配器MCLI

    PS2-88,PS2-88/NF功率分配器MCLIPS2-88功率分配器是MCLI品牌推出的一款高性能射頻微波器件,屬于PS2系列2路功率分配器。PS2-88功率分配器是一款高性能的射
    發(fā)表于 03-20 09:31

    PS2-185/NF帶狀線2路電源分配器

    PS2-185/NF帶狀線2路電源分配器PS2-185/NF帶狀線2路電源分配器具備高可靠性,通過(guò)不同種類的結(jié)構(gòu)(如帶狀線、微帶和集總器件方式)來(lái)適合各種需求和應(yīng)用。主要特性電氣性能頻率范圍
    發(fā)表于 01-08 09:23

    英邁質(zhì)譜分配器:精準(zhǔn)控制,引領(lǐng)質(zhì)譜分析新高度

    在質(zhì)譜分析這一精密科學(xué)領(lǐng)域,流體的精準(zhǔn)輸送對(duì)于獲取高質(zhì)量數(shù)據(jù)至關(guān)重要。為了滿足這一嚴(yán)苛需求,Instrumax(英邁儀器)憑借其在流體控制領(lǐng)域的深厚積累,推出了全新的質(zhì)譜分配器。 這款質(zhì)譜
    的頭像 發(fā)表于 12-26 14:14 ?343次閱讀

    CDCL1810A 1.8V、10 輸出高性能時(shí)鐘分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCL1810A 1.8V、10 輸出高性能時(shí)鐘分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-23 10:08 ?0次下載
    CDCL1810A 1.8V、10 輸出高性能時(shí)鐘<b class='flag-5'>分配器</b>數(shù)據(jù)表

    CDCL1810 1.8V 10路輸出高性能時(shí)鐘分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCL1810 1.8V 10路輸出高性能時(shí)鐘分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-22 11:14 ?0次下載
    CDCL1810 1.8V 10路輸出高性能時(shí)鐘<b class='flag-5'>分配器</b>數(shù)據(jù)表

    CDCE18005高性能時(shí)鐘分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCE18005高性能時(shí)鐘分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-21 11:12 ?0次下載
    CDCE18005高性能時(shí)鐘<b class='flag-5'>分配器</b>數(shù)據(jù)表

    CDCE62005高性能時(shí)鐘發(fā)生器和分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《CDCE62005高性能時(shí)鐘發(fā)生器和分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-21 11:12 ?0次下載
    CDCE62005高性能時(shí)鐘發(fā)生器和<b class='flag-5'>分配器</b>數(shù)據(jù)表

    LMK01000高性能時(shí)鐘緩沖器、分頻器和分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《LMK01000高性能時(shí)鐘緩沖器、分頻器和分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 08-21 09:53 ?0次下載
    LMK01000高性能時(shí)鐘緩沖器、分頻器和<b class='flag-5'>分配器</b>數(shù)據(jù)表

    液壓分配器起什么作用的

    液壓分配器是一種用于控制液壓系統(tǒng)中液體流量和壓力的設(shè)備。它在許多工業(yè)和工程應(yīng)用中發(fā)揮著重要作用,例如在液壓升降機(jī)、液壓挖掘機(jī)、液壓起重機(jī)等設(shè)備中。以下是液壓分配器的主要功能和原理: 流量控制 :液壓分配器
    的頭像 發(fā)表于 07-10 10:56 ?1739次閱讀

    液壓分配器工作原理是什么

    液壓分配器,又稱液壓多路閥,是液壓系統(tǒng)中的關(guān)鍵部件之一。它的作用是將液壓泵輸出的油液分配到各個(gè)執(zhí)行機(jī)構(gòu),實(shí)現(xiàn)液壓系統(tǒng)的控制和調(diào)節(jié)。 一、液壓分配器的工作原理 液壓分配器的基本組成 液壓
    的頭像 發(fā)表于 07-10 10:55 ?3533次閱讀

    液壓分配器壓力調(diào)整方法有哪些

    液壓分配器,又稱液壓分配器或液壓分流器,是一種用于液壓系統(tǒng)中的設(shè)備,主要用于將液壓系統(tǒng)中的壓力油分配到各個(gè)執(zhí)行元件,以實(shí)現(xiàn)對(duì)液壓系統(tǒng)的控制和調(diào)節(jié)。 一、液壓分配器壓力調(diào)整的重要性 液壓
    的頭像 發(fā)表于 07-10 10:53 ?3253次閱讀

    單線分配器與雙線分配器的區(qū)別是什么

    單線分配器與雙線分配器是兩種不同類型的電子設(shè)備,它們?cè)谕ㄐ拧V播、電視等領(lǐng)域中有著廣泛的應(yīng)用。本文將介紹單線分配器與雙線分配器的區(qū)別。 一、定義 單線
    的頭像 發(fā)表于 07-10 10:44 ?1554次閱讀

    四路數(shù)據(jù)分配器的基本概念、工作原理、應(yīng)用場(chǎng)景及設(shè)計(jì)方法

    四路數(shù)據(jù)分配器是一種數(shù)字電路元件,它的作用是將一個(gè)數(shù)據(jù)輸入信號(hào)分配成多個(gè)數(shù)據(jù)輸出信號(hào)。 1. 四路數(shù)據(jù)分配器的基本概念 四路數(shù)據(jù)分配器是一種多路復(fù)用器(Multiplexer),它將一
    的頭像 發(fā)表于 07-10 10:42 ?2739次閱讀

    八路數(shù)據(jù)分配器的基本概念及工作原理

    八路數(shù)據(jù)分配器是一種常見(jiàn)的電子設(shè)備,用于將一個(gè)輸入信號(hào)分配到多個(gè)輸出端。在本文中,我們將詳細(xì)介紹八路數(shù)據(jù)分配器的基本概念、工作原理、應(yīng)用場(chǎng)景以及設(shè)計(jì)方法。 一、八路數(shù)據(jù)分配器的基本概念
    的頭像 發(fā)表于 07-10 10:40 ?3301次閱讀

    DS90LV110AT 1至10 LVDS數(shù)據(jù)/時(shí)鐘分配器數(shù)據(jù)表

    電子發(fā)燒友網(wǎng)站提供《DS90LV110AT 1至10 LVDS數(shù)據(jù)/時(shí)鐘分配器數(shù)據(jù)表.pdf》資料免費(fèi)下載
    發(fā)表于 07-05 11:34 ?0次下載
    DS90LV110AT 1至10 LVDS數(shù)據(jù)/時(shí)鐘<b class='flag-5'>分配器</b>數(shù)據(jù)表
    主站蜘蛛池模板: 一区二区中文字幕 | 亚洲第成色999久久网站 | 国产人人爱 | 狠狠色丁香婷婷 | 日本免费不卡在线一区二区三区 | bt种子在线搜索 | 91九色麻豆| 精品伊人久久大线蕉地址 | 涩涩高清无乱码在线观看 | 亚洲jizzjizz | 中文字幕亚洲综合久久2 | 国产午夜精品理论片在线 | 色偷偷91久久综合噜噜噜 | 久久99精品久久久久久园产越南 | 嫩草影院播放地址一二三 | 日本天堂网在线观看 | 日本伊人网 | 中文天堂在线观看 | bt天堂网在线 | 日本精品一卡二卡≡卡四卡 | 天堂资源在线 | 久久精品国产亚洲片 | 午夜美女视频在线观看高清 | 九色欧美 | 国产一区二区三区夜色 | 国产伦精品一区二区三区 | 国产黄色高清视频 | 成人三级电影在线观看 | 国内精品免费视频精选在线观看 | 国产人成精品香港三级古代 | 色综合久久88 | 四虎影院新网址 | 亚洲丝袜一区二区 | 午夜精品久久久久久影视riav | 国产无套视频在线观看香蕉 | 亚洲成成品网站有线 | 日本aaaa级片 | 失禁h啪肉尿出来高h健身房 | 欧美人与动性行为网站免费 | 免费伦费一区二区三区四区 | 奇米第四狠狠777高清秒播 |