在线观看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)不再提示

CUDA Runtime和L2 Cache簡(jiǎn)析

冬至子 ? 來(lái)源:指北筆記 ? 作者:張北北 ? 2023-05-19 14:58 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

CUDA Runtime

運(yùn)行時(shí)在cudart庫(kù)中實(shí)現(xiàn),該庫(kù)通過(guò)cudart靜態(tài)地鏈接到應(yīng)用程序。

所有入口都有cuda的前綴。

正如在異構(gòu)編程中提到的,CUDA編程模型假設(shè)一個(gè)由主機(jī)和設(shè)備組成的系統(tǒng),每個(gè)設(shè)備都有自己的獨(dú)立內(nèi)存。

Initialization

運(yùn)行時(shí)沒(méi)有顯式的初始化函數(shù)。 它在第一次調(diào)用運(yùn)行時(shí)函數(shù) (更確切地說(shuō),是參考手冊(cè)中錯(cuò)誤處理和版本管理部分的函數(shù)以外的任何函數(shù)) 時(shí)初始化

運(yùn)行時(shí)為系統(tǒng)中的每個(gè)設(shè)備創(chuàng)建一個(gè)CUDA Context 。該上下文是該設(shè)備的primary context, 在該設(shè)備上需要活動(dòng)上下文的第一個(gè)運(yùn)行時(shí)函數(shù)時(shí)初始化它在應(yīng)用程序的所有主機(jī)線程之間共享作為創(chuàng)建上下文的一部分,如果需要的話,設(shè)備代碼將被實(shí)時(shí)編譯并加載到設(shè)備內(nèi)存中 。這一切都是透明的。如果需要,例如,為了驅(qū)動(dòng)API的互操作性,可以從驅(qū)動(dòng)API訪問(wèn)設(shè)備的主上下文。

當(dāng)主機(jī)線程調(diào)用cudaDeviceReset()時(shí),這將銷毀主機(jī)線程當(dāng)前操作的設(shè)備的 primary context (即在device Selection中定義的當(dāng)前設(shè)備)。當(dāng)前擁有該設(shè)備的任何主機(jī)線程的下一個(gè)運(yùn)行時(shí)函數(shù)調(diào)用將為該設(shè)備創(chuàng)建一個(gè)新的 primary context。

注意:CUDA接口使用全局狀態(tài),該狀態(tài)在主機(jī)程序啟動(dòng)時(shí)初始化,在主機(jī)程序終止時(shí)銷毀。CUDA運(yùn)行時(shí)和驅(qū)動(dòng)程序無(wú)法檢測(cè)此狀態(tài)是否無(wú)效,因此在程序啟動(dòng)或main后終止期間使用任何這些接口(隱式或顯式)將導(dǎo)致未定義的行為。

Device Memory

正如在異構(gòu)編程中提到的,CUDA編程模型假設(shè)一個(gè)由主機(jī)和設(shè)備組成的系統(tǒng),每個(gè)設(shè)備都有自己的獨(dú)立內(nèi)存。內(nèi)核在設(shè)備內(nèi)存之外運(yùn)行,因此運(yùn)行時(shí)提供了分配、釋放和復(fù)制設(shè)備內(nèi)存的函數(shù),以及在主機(jī)內(nèi)存和設(shè)備內(nèi)存之間傳輸數(shù)據(jù)。

設(shè)備內(nèi)存可以分配作為linear memory 或 CUDA arrays。

  • CUDA arrays 是為 texture fetching 優(yōu)化的不透明內(nèi)存布局。
  • Linear memory 在單一的統(tǒng)一地址空間中分配,這意味著分別分配的實(shí)體可以通過(guò)指針相互引用,例如,在二叉樹(shù)或鏈表中。地址空間的大小取決于主機(jī)系統(tǒng)(CPU)和使用的GPU的計(jì)算能力.

Graphics Interoperability 介紹了運(yùn)行時(shí)提供的與兩個(gè)主要圖形API,OpenGL和 Direct3D互操作的各種功能。

Texture and Surface Memory 提供了紋理和表面存儲(chǔ)器空間,提供了訪問(wèn)設(shè)備內(nèi)存的另一種方式;它們還公開(kāi)了GPU紋理硬件的一個(gè)子集。

Call Stack 提到了用于管理CUDA c++調(diào)用棧的運(yùn)行時(shí)函數(shù)。

Error Checking 描述如何正確檢查運(yùn)行時(shí)生成的錯(cuò)誤。

Multi-Device System 展示了編程模型如何擴(kuò)展到具有多個(gè)設(shè)備連接到同一主機(jī)的系統(tǒng)。

Asynchronous Concurrent Execution 描述了用于在系統(tǒng)的各個(gè)級(jí)別上支持異步并發(fā)執(zhí)行的概念和API。

Page-Locked Host Memory 引入了頁(yè)鎖定主機(jī)內(nèi)存,它需要在內(nèi)核執(zhí)行與主機(jī)和設(shè)備內(nèi)存之間的數(shù)據(jù)傳輸重疊。

Shared Memory演示了如何使用線程層次結(jié)構(gòu)中引入的共享內(nèi)存來(lái)最大化性能。

Linear memory 通常使用 cudaMalloc() 分配,使用cudaFree()釋放,主機(jī)內(nèi)存和設(shè)備內(nèi)存之間的數(shù)據(jù)傳輸通常使用cudaMemcpy()完成。在kernel的vector加法代碼示例中,需要將vector從主機(jī)內(nèi)存復(fù)制到設(shè)備內(nèi)存:

// Device code

__global__

void

VecAdd

(

float

* A,

float

* B,

float

* C,

int

N)

{

int

i = blockDim.x * blockIdx.x + threadIdx.x;

if

(i < N)

C[i] = A[i] + B[i];

}

// Host code

int

main

()

{

int

N = ...;

size_t

size = N *

sizeof

(

float

);

// Allocate input vectors h_A and h_B in host memory

float

* h_A = (

float

*)

malloc

(size);

float

* h_B = (

float

*)

malloc

(size);

float

* h_C = (

float

*)

malloc

(size);

// Initialize input vectors

...

// Allocate vectors in device memory

float

* d_A;

cudaMalloc(&d_A, size);

float

* d_B;

cudaMalloc(&d_B, size);

float

* d_C;

cudaMalloc(&d_C, size);

// Copy vectors from host memory to device memory

cudaMemcpy(d_A, h_A, size, cudaMemcpyHostToDevice);

cudaMemcpy(d_B, h_B, size, cudaMemcpyHostToDevice);

// Invoke kernel

int

threadsPerBlock =

256

;

int

blocksPerGrid =

(N + threadsPerBlock -

1

) / threadsPerBlock;

VecAdd<<>>(d_A, d_B, d_C, N);

// Copy result from device memory to host memory

// h_C contains the result in host memory

cudaMemcpy(h_C, d_C, size, cudaMemcpyDeviceToHost);

// Free device memory

cudaFree(d_A);

cudaFree(d_B);

cudaFree(d_C);

// Free host memory

...

}

Linear memory 也可以通過(guò)cudaMallocPitch()cudaMalloc3D()來(lái)分配。這些函數(shù)被推薦用于2D或3D數(shù)組的分配,因?yàn)樗_保分配被適當(dāng)填充,以滿足設(shè)備內(nèi)存訪問(wèn)中描述的對(duì)齊要求,因此在訪問(wèn)行地址或在2D數(shù)組和設(shè)備內(nèi)存的其他區(qū)域之間執(zhí)行復(fù)制時(shí)(使用cudaMemcpy2D()cudaMemcpy3D()函數(shù))確保最佳性能。返回的pitch(或stride)必須用于訪問(wèn)數(shù)組元素。

  • 下面的代碼示例分配了一個(gè) width x height 的二維浮點(diǎn)值數(shù)組,并展示了如何在設(shè)備代碼中循環(huán)遍歷數(shù)組元素:

// Host code

int

width =

64

, height =

64

;

float

* devPtr;

size_t

pitch;

cudaMallocPitch(&devPtr, &pitch,

width *

sizeof

(

float

), height);

MyKernel<<<

100

,

512

>>>(devPtr, pitch, width, height);

// Device code

__global__

void

MyKernel

(

float

* devPtr,

size_t

pitch,

int

width,

int

height)

{

for

(

int

r =

0

; r < height; ++r) {

float

* row = (

float

*)((

char

*)devPtr + r * pitch);

for

(

int

c =

0

; c < width; ++c) {

float

element = row[c];

}

}

}

  • 下面的代碼示例分配了一個(gè) width x height x depth 的浮點(diǎn)值3D數(shù)組,并展示了如何在設(shè)備代碼中循環(huán)遍歷數(shù)組元素:

// Host code

int

width =

64

, height =

64

, depth =

64

;

cudaExtent extent = make_cudaExtent(width *

sizeof

(

float

),

height, depth);

cudaPitchedPtr devPitchedPtr;

cudaMalloc3D(&devPitchedPtr, extent);

MyKernel<<<

100

,

512

>>>(devPitchedPtr, width, height, depth);

// Device code

__global__

void

MyKernel

(cudaPitchedPtr devPitchedPtr,

int

width,

int

height,

int

depth)

{

char

* devPtr = devPitchedPtr.ptr;

size_t

pitch = devPitchedPtr.pitch;

size_t

slicePitch = pitch * height;

for

(

int

z =

0

; z < depth; ++z) {

char

* slice = devPtr + z * slicePitch;

for

(

int

y =

0

; y < height; ++y) {

float

* row = (

float

*)(slice + y * pitch);

for

(

int

x =

0

; x < width; ++x) {

float

element = row[x];

}

}

}

}

下面的代碼示例演示了通過(guò)運(yùn)行時(shí)API訪問(wèn)全局變量的各種方法:

__constant__

float

constData[

256

];

float

data[

256

];

cudaMemcpyToSymbol(constData, data,

sizeof

(data));

cudaMemcpyFromSymbol(data, constData,

sizeof

(data));

__device__

float

devData;

float

value =

3.14f

;

cudaMemcpyToSymbol(devData, &value,

sizeof

(

float

));

__device__

float

* devPointer;

float

* ptr;

cudaMalloc(&ptr,

256

*

sizeof

(

float

));

cudaMemcpyToSymbol(devPointer, &ptr,

sizeof

(ptr));

cudaGetSymbolAddress()用于檢索指向分配給在全局內(nèi)存空間中聲明的變量的內(nèi)存的地址。所分配內(nèi)存的大小通過(guò)cudaGetSymbolSize()獲得。

Device Memory L2 Access Management

當(dāng)CUDA內(nèi)核重復(fù)訪問(wèn)全局內(nèi)存中的數(shù)據(jù)區(qū)域時(shí),可以認(rèn)為這種數(shù)據(jù)訪問(wèn)是 persisting

另一方面,如果數(shù)據(jù)只被訪問(wèn)一次,則可以將這種數(shù)據(jù)訪問(wèn)視為 streaming

從CUDA 11.0開(kāi)始,具有8.0及以上計(jì)算能力的設(shè)備能夠影響L2緩存中的數(shù)據(jù)持久性,從而可能提供更高的帶寬和更低的全局內(nèi)存訪問(wèn)延遲。

L2 cache Set-Aside for Persisting Accesses

L2緩存的一部分可以被預(yù)留出來(lái),用于持久化對(duì)全局內(nèi)存的數(shù)據(jù)訪問(wèn) 。持久化訪問(wèn)優(yōu)先使用L2緩存的預(yù)留部分,而正常的或流的全局內(nèi)存訪問(wèn)只能在持久化訪問(wèn)未使用時(shí)使用L2的這部分。

用于持久化訪問(wèn)的L2緩存預(yù)留大小可以在限制范圍內(nèi)進(jìn)行調(diào)整:

cudaGetDeviceProperties(&prop, device_id);

size_t

size = min(

int

(prop.l2CacheSize *

0.75

), prop.persistingL2CacheMaxSize);

cudaDeviceSetLimit(cudaLimitPersistingL2CacheSize, size);

/* set-aside 3/4 of L2 cache for persisting accesses or the max allowed*/

當(dāng)GPU配置為MIG (Multi-Instance GPU)模式時(shí),L2緩存預(yù)留功能不可用。

當(dāng)使用多進(jìn)程服務(wù)(MPS)時(shí),L2緩存預(yù)留大小不能通過(guò)cudaDeviceSetLimit來(lái)改變。相反,只能在啟動(dòng)MPS服務(wù)器時(shí)通過(guò)環(huán)境變量CUDA_DEVICE_DEFAULT_PERSISTING_L2_CACHE_PERCENTAGE_LIMIT指定預(yù)留大小。

L2 Policy for Persisting Accesses

訪問(wèn)策略窗口指定全局內(nèi)存的連續(xù)區(qū)域和L2緩存中的持久性屬性,以便在該區(qū)域內(nèi)進(jìn)行訪問(wèn)。

下面的代碼示例展示了如何使用CUDA流設(shè)置L2持久化訪問(wèn)窗口。

  • CUDA Stream Example

cudaStreamAttrValue stream_attribute;

// Stream level attributes data structure

stream_attribute.accessPolicyWindow.base_ptr =

reinterpret_cast

<

void

*>(ptr);

// Global Memory data pointer

stream_attribute.accessPolicyWindow.num_bytes = num_bytes;

// Number of bytes for persistence access.

// (Must be less than cudaDeviceProp::accessPolicyMaxWindowSize)

stream_attribute.accessPolicyWindow.hitRatio =

0.6

;

// Hint for cache hit ratio

stream_attribute.accessPolicyWindow.hitProp = cudaAccessPropertyPersisting;

// Type of access property on cache hit

stream_attribute.accessPolicyWindow.missProp = cudaAccessPropertyStreaming;

// Type of access property on cache miss.

//Set the attributes to a CUDA stream of type cudaStream_t

cudaStreamSetAttribute(stream, cudaStreamAttributeAccessPolicyWindow, &stream_attribute);

當(dāng)內(nèi)核隨后在CUDA stream 中執(zhí)行時(shí),全局內(nèi)存范圍 [ptr..ptr+num_bytes] 內(nèi)的內(nèi)存訪問(wèn)比訪問(wèn)其他全局內(nèi)存位置更有可能持久存在L2緩存中。

  • CUDA GraphKernelNode Example

cudaKernelNodeAttrValue node_attribute;

// Kernel level attributes data structure

node_attribute.accessPolicyWindow.base_ptr =

reinterpret_cast

<

void

*>(ptr);

// Global Memory data pointer

node_attribute.accessPolicyWindow.num_bytes = num_bytes;

// Number of bytes for persistence access.

// (Must be less than cudaDeviceProp::accessPolicyMaxWindowSize)

node_attribute.accessPolicyWindow.hitRatio =

0.6

;

// Hint for cache hit ratio

node_attribute.accessPolicyWindow.hitProp = cudaAccessPropertyPersisting;

// Type of access property on cache hit

node_attribute.accessPolicyWindow.missProp = cudaAccessPropertyStreaming;

// Type of access property on cache miss.

//Set the attributes to a CUDA Graph Kernel node of type cudaGraphNode_t

cudaGraphKernelNodeSetAttribute(node, cudaKernelNodeAttributeAccessPolicyWindow, &node_attribute);

可以使用hitRatio參數(shù)指定接收hitProp屬性的訪問(wèn)的比例。在上面的兩個(gè)示例中,全局內(nèi)存區(qū)域中60%的內(nèi)存訪問(wèn)[ptr..ptr+num_bytes]具有持久化屬性,40%的內(nèi)存訪問(wèn)具有流屬性。哪些特定的內(nèi)存訪問(wèn)被分類為持久化(hitProp)是隨機(jī)的,概率近似于hitRatio;概率分布取決于硬件架構(gòu)和內(nèi)存大小。

例如,如果L2預(yù)留緩存大小為16KB,而accessPolicyWindow中的num_bytes為32KB:

  • 當(dāng)命中率為0.5時(shí),硬件將隨機(jī)選擇32KB窗口中的16KB指定為持久化并緩存到預(yù)留的L2緩存區(qū)。
  • 當(dāng)hitRatio為1.0時(shí),硬件將嘗試將整個(gè)32KB窗口緩存到預(yù)留的L2緩存區(qū)。由于預(yù)留區(qū)域比窗口小,緩存行將被刪除,以將最近使用的16KB數(shù)據(jù)保存在L2緩存的預(yù)留部分。

因此,可以使用hitRatio來(lái)避免緩存線的抖動(dòng),并從總體上減少移動(dòng)到L2緩存和移出的數(shù)據(jù)量。

hitRatio值低于1.0可用于手動(dòng)控制與并發(fā)CUDA流不同的accessPolicyWindows可以在L2中緩存的數(shù)據(jù)量。例如,設(shè)L2預(yù)留緩存大小為16KB;在兩個(gè)不同的CUDA流中的兩個(gè)并發(fā)內(nèi)核,每個(gè)都具有16KB的accessPolicyWindow,并且都具有1.0的hitRatio值,在競(jìng)爭(zhēng)共享的L2資源時(shí),可能會(huì)驅(qū)逐彼此的緩存線。但是,如果兩個(gè)accessPolicyWindows的hitRatio值都是0.5,它們就不太可能驅(qū)逐自己的或彼此的持久化緩存行。

L2 Access Properties

為不同的全局內(nèi)存數(shù)據(jù)訪問(wèn)定義了三種類型的訪問(wèn)屬性:

  1. cudaAccessPropertyStreaming:帶有streaming屬性的內(nèi)存訪問(wèn)不太可能持久存在L2緩存中,因?yàn)檫@些訪問(wèn)會(huì)優(yōu)先被刪除。
  2. cudaAccessPropertyPersisting:具有persisting屬性的內(nèi)存訪問(wèn)更有可能保存在L2緩存中,因?yàn)檫@些訪問(wèn)優(yōu)先保存在L2緩存的預(yù)留部分。
  3. cudaAccessPropertyNormal: 這個(gè)訪問(wèn)屬性強(qiáng)制重置之前應(yīng)用的持久化訪問(wèn)屬性到正常狀態(tài)。來(lái)自以前CUDA內(nèi)核的具有持久化屬性的內(nèi)存訪問(wèn)可能會(huì)在預(yù)期使用之后很長(zhǎng)時(shí)間內(nèi)保留在L2緩存中。這種使用后持久化減少了不使用持久化屬性的后續(xù)內(nèi)核可用的L2緩存量。使用cudaAccessPropertyNormal屬性重置訪問(wèn)屬性窗口將刪除先前訪問(wèn)的持久(優(yōu)先保留)狀態(tài),就像先前訪問(wèn)沒(méi)有訪問(wèn)屬性一樣。

L2 Persistence Example

下面的例子展示了如何為持久訪問(wèn)預(yù)留L2緩存,通過(guò)CUDA流在CUDA內(nèi)核中使用預(yù)留的L2緩存,然后重置L2緩存。

cudaStream_t stream;

cudaStreamCreate(&stream);

// Create CUDA stream

cudaDeviceProp prop;

// CUDA device properties variable

cudaGetDeviceProperties( &prop, device_id);

// Query GPU properties

size_t

size = min(

int

(prop.l2CacheSize *

0.75

) , prop.persistingL2CacheMaxSize );

cudaDeviceSetLimit( cudaLimitPersistingL2CacheSize, size);

// set-aside 3/4 of L2 cache for persisting accesses or the max allowed

size_t

window_size = min(prop.accessPolicyMaxWindowSize, num_bytes);

// Select minimum of user defined num_bytes and max window size.

cudaStreamAttrValue stream_attribute;

// Stream level attributes data structure

stream_attribute.accessPolicyWindow.base_ptr =

reinterpret_cast

<

void

*>(data1);

// Global Memory data pointer

stream_attribute.accessPolicyWindow.num_bytes = window_size;

// Number of bytes for persistence access

stream_attribute.accessPolicyWindow.hitRatio =

0.6

;

// Hint for cache hit ratio

stream_attribute.accessPolicyWindow.hitProp = cudaAccessPropertyPersisting;

// Persistence Property

stream_attribute.accessPolicyWindow.missProp = cudaAccessPropertyStreaming;

// Type of access property on cache miss

cudaStreamSetAttribute(stream, cudaStreamAttributeAccessPolicyWindow, &stream_attribute);

// Set the attributes to a CUDA Stream

for

(

int

i =

0

; i <

10

; i++) {

cuda_kernelA<<

`

0

,stream>>>(data1);

// This data1 is used by a kernel multiple times

}

// [data1 + num_bytes) benefits from L2 persistence

cuda_kernelB<<,block_size,<>

0

,stream>>>(data1);

// A different kernel in the same stream can also benefit

// from the persistence of data1

stream_attribute.accessPolicyWindow.num_bytes =

0

;

// Setting the window size to 0 disable it

cudaStreamSetAttribute(stream, cudaStreamAttributeAccessPolicyWindow, &stream_attribute);

// Overwrite the access policy attribute to a CUDA Stream

cudaCtxResetPersistingL2Cache();

// Remove any persistent lines in L2

cuda_kernelC<<,block_size,<>

0

,stream>>>(data2);

// data2 can now benefit from full L2 in normal mode

Reset L2 Access to Normal

來(lái)自上一個(gè)CUDA內(nèi)核的持久化L2緩存線可能在它被使用后很長(zhǎng)一段時(shí)間內(nèi)持久化L2。因此,對(duì)于流或正常內(nèi)存訪問(wèn)來(lái)說(shuō),L2緩存的正常優(yōu)先級(jí)重置為正常是很重要的。有三種方法可以將持久化訪問(wèn)重置為正常狀態(tài)。

使用訪問(wèn)屬性cudaAccessPropertyNormal設(shè)置先前的持久化內(nèi)存區(qū)域。

通過(guò)調(diào)用cudaCtxResetPersistingL2Cache()將所有持久化L2緩存線重置為正常。

最終未碰觸的線路會(huì)自動(dòng)重置為正常。由于自動(dòng)復(fù)位發(fā)生所需的時(shí)間長(zhǎng)度不確定,因此強(qiáng)烈不鼓勵(lì)依賴自動(dòng)復(fù)位。

Manage Utilization of L2 set-aside cache

在不同的CUDA流中并發(fā)執(zhí)行的多個(gè)CUDA內(nèi)核可能會(huì)為它們的流分配不同的訪問(wèn)策略窗口。然而, L2預(yù)留緩存部分在所有這些并發(fā)CUDA內(nèi)核之間共享 。因此, 這個(gè)預(yù)留緩存部分的凈利用率是所有并發(fā)內(nèi)核單獨(dú)使用的總和 。當(dāng)持久化訪問(wèn)的量超過(guò)預(yù)留的L2緩存容量時(shí),將內(nèi)存訪問(wèn)指定為持久化訪問(wèn)的好處就會(huì)減少。

為了管理預(yù)留的L2緩存部分的利用率,應(yīng)用程序必須考慮以下因素:

L2預(yù)留緩存的大小。

可以并發(fā)執(zhí)行的CUDA內(nèi)核。

可并發(fā)執(zhí)行的所有CUDA內(nèi)核的訪問(wèn)策略窗口。

需要在何時(shí)以及如何重置L2,以允許normal或streaming訪問(wèn)以同等優(yōu)先級(jí)利用之前設(shè)置的L2緩存。

Query L2 cache Properties

與L2緩存相關(guān)的屬性是cudaDeviceProp結(jié)構(gòu)的一部分,可以使用CUDA運(yùn)行時(shí)API cudaGetDeviceProperties查詢.

CUDA設(shè)備屬性包括:

l2CacheSize: GPU上可用的L2緩存量。

persistingL2CacheMaxSize:可為持久內(nèi)存訪問(wèn)預(yù)留的L2緩存的最大數(shù)量。

accessPolicyMaxWindowSize:訪問(wèn)策略窗口的最大大小。

Control L2 Cache Set-Aside Size for Persisting Memory Access

使用CUDA運(yùn)行時(shí)API cudaDeviceGetLimit查詢用于持久化內(nèi)存訪問(wèn)的L2預(yù)留緩存大小,并使用CUDA運(yùn)行時(shí)API cudaDeviceSetLimit作為cudaLimit進(jìn)行設(shè)置。該限制的最大值為cudaDeviceProp::persistingL2CacheMaxSize

enum

cudaLimit {

/* other fields not shown */

cudaLimitPersistingL2CacheSize

};

`
聲明:本文內(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)投訴
  • MPS
    MPS
    +關(guān)注

    關(guān)注

    26

    文章

    296

    瀏覽量

    65927
  • CUDA
    +關(guān)注

    關(guān)注

    0

    文章

    122

    瀏覽量

    14103
  • cache技術(shù)
    +關(guān)注

    關(guān)注

    0

    文章

    41

    瀏覽量

    1217
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

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

    關(guān)于6678 cache的疑問(wèn)

    工程師你好: 最近看了6678的cache手冊(cè),仍有下面不確定的問(wèn)題,請(qǐng)解答(以下都是說(shuō)的數(shù)據(jù)cache,不是程序cache)。 1、CPU對(duì)L2 RAM和
    發(fā)表于 06-21 07:43

    C674x 平臺(tái)(DM8148)數(shù)據(jù)從 DDR3 到 L1,L2,內(nèi)存及cache設(shè)置

    目前從事DM8148平臺(tái)的開(kāi)發(fā)工作,想請(qǐng)教一個(gè)問(wèn)題: 通常情況下,數(shù)據(jù)從外存通過(guò)EDMA搬移到L2 cache,然后L1 cache 命中,供CPU訪問(wèn),CPU處理完數(shù)據(jù),在通過(guò)EDM
    發(fā)表于 06-22 03:35

    請(qǐng)教關(guān)于C674x DSP L1 L2cache設(shè)置

    目前從事DM8148平臺(tái)的開(kāi)發(fā)工作,想請(qǐng)教一個(gè)問(wèn)題:通常情況下,數(shù)據(jù)從外存通過(guò)EDMA搬移到L2 cache,然后L1 cache 命中,供CPU訪問(wèn),CPU處理完數(shù)據(jù),在通過(guò)EDMA
    發(fā)表于 07-24 06:57

    L1或者L2中可以配置為cache或者SRAM,請(qǐng)問(wèn)cache的配置與什么有關(guān)?

    關(guān)于cache配置的問(wèn)題,在L1或者L2中可以配置為cache或者SRAM,請(qǐng)問(wèn)cache的配置與什么有關(guān)?有一些參考資料么?謝謝沒(méi)有搞清楚
    發(fā)表于 07-25 09:24

    在DSP/BIOS想將L2的64k配置成cache,請(qǐng)問(wèn)需要怎么操作?

    您好,我使用的芯片是C6748,使用DSP/BIOS。C6748的L1P L1D L2都可以部分配置成緩存或RAM。DSP/BIOS中默認(rèn)設(shè)置L1P
    發(fā)表于 08-02 06:54

    關(guān)于C6747片上RAM,請(qǐng)問(wèn)shared RAM與L2又有何區(qū)別?

    諸位高手:小弟使用的是C6747,資料上說(shuō)這款芯片上有好幾個(gè)RAM,包括L1、L2和shared RAM,而L1、L2又分別有兩塊地址與之對(duì)應(yīng),不知有何區(qū)別,而shared RAM與
    發(fā)表于 08-07 07:31

    求解6678 L2cache和 .text放ddr3的問(wèn)題

    hi all,求問(wèn)兩個(gè)問(wèn)題;1如果用 cache_setL2size(cache_256kcache),設(shè)置,意思是L2(總512k)中256k作為cache使用了,剩余256k作為s
    發(fā)表于 12-29 14:11

    請(qǐng)問(wèn)6678 L2的數(shù)據(jù)搬移到DDR需要人為的進(jìn)行cache一致性操作嗎?

    我看論壇中講LL2cache一致性是由硬件維護(hù)。也就是說(shuō)如果從DDR搬移到L2或者L2搬移到DDR,都不需要程序員進(jìn)行cache一致性的操
    發(fā)表于 01-14 14:36

    L2 Cache配置方案那種更好?

    對(duì)于其它外設(shè)不會(huì)修改,即只有CPU進(jìn)行讀寫的數(shù)據(jù),有兩種配置方案:1.將L2 Cache配置為SRAM,數(shù)據(jù)存于L2 Cache,即數(shù)據(jù)直接放置于L
    發(fā)表于 08-05 14:50

    請(qǐng)問(wèn)L2怎么配置成128KRAM和128KCACHE?

    創(chuàng)龍技術(shù)支持工程師您好: 我使用C6748實(shí)現(xiàn)圖像處理,需要完成CACHE的優(yōu)化。圖像處理的圖片為64K,想將L2分配為128Kcache與128K 內(nèi)部RAM使用。問(wèn)題1:128K的內(nèi)部RAM存儲(chǔ)
    發(fā)表于 10-21 08:21

    介紹一種多級(jí)cache的包含策略(Cache inclusion policy)

    ,NINE)cache。Inclusive Policy cache考慮一個(gè)兩級(jí)cache 結(jié)構(gòu)的示例,其中 L2L1 是inclu
    發(fā)表于 07-20 14:46

    ARM架構(gòu)下的L1和L2 cache結(jié)構(gòu)有什么聯(lián)系

    以A15為例,假設(shè)L1 cache2way 4set的 cache type,而L2 cache
    發(fā)表于 08-12 11:36

    如何獲取CPU中L1/L2Cache狀態(tài)和大小?如何禁用和使能Cache呢?

    請(qǐng)問(wèn),用I.MX6UL開(kāi)發(fā)板OKMX6UL,使用Linux的情況下,如何獲取CPU中L1/L2Cache狀態(tài)和大小;如何禁用和使能Cache
    發(fā)表于 11-29 06:37

    Cache為什么還要分I-Cache,D-CacheL2 Cache,作用是什么?

    Cache為什么還要分I-Cache,D-CacheL2 Cache,作用是什么?
    發(fā)表于 10-25 06:38

    深入理解Cache工作原理

    按照數(shù)據(jù)關(guān)系劃分:Inclusive/exclusive Cache: 下級(jí)Cache包含上級(jí)的數(shù)據(jù)叫inclusive Cache。不包含叫exclusive Cache。舉個(gè)例子,
    的頭像 發(fā)表于 05-30 16:02 ?1098次閱讀
    深入理解<b class='flag-5'>Cache</b>工作原理
    主站蜘蛛池模板: 六月丁香啪啪六月激情 | 天天干夜夜噜 | 伊人久久亚洲综合 | 99久久婷婷国产综合精品电影 | 黄黄网站| 婷婷六月天激情 | 天堂网最新版www | 天天摸天天碰成人免费视频 | 扒开双腿猛进湿润18p | 国产午夜视频高清 | 免费伦费一区二区三区四区 | 日韩中文字幕电影 | 狠狠干天天操 | 中文字幕日本一区波多野不卡 | 欧美zooz人禽交免费 | 成人福利在线视频 | 色婷婷激情五月综合 | 久久久久久88色偷偷 | 性做久久久久久久久 | 久操久操 | 色多多在线播放 | 色爱区综合 | 五月天色婷婷丁香 | 久久国产热视频 | 超级黄色毛片 | 天堂亚洲网 | 国产精品入口免费视频 | 国产午夜精品片一区二区三区 | 一级a性色生活片毛片 | 国产免费高清在线精品一区 | 日本三级在线观看免费 | 欧美人与动欧交视频 | 77788色淫网站免费观看 | 五月婷婷一区 | 91综合在线 | 久久伊人男人的天堂网站 | 午夜欧美 | 国产亚洲午夜精品a一区二区 | 一区二区三区四区视频在线观看 | 国产精品黄网站免费观看 | 色噜噜狠狠狠狠色综合久 |