在Intel iGPU的,
// tmp-store
// tmp2-compute
// tmp3-load
pipelineEvent[0]=async_work_group_copy(&b[g*gs],tmp,gs,pipelineEvent[0]);
pipelineEvent[0]=async_work_group_copy(tmp3,&e[g*gs],gs,pipelineEvent[0]);
tmp2[l]=tmp2[l]+3;
wait_group_events(1,&pipelineEvent[0]);
給出了相同的延遲相同的輸出
// tmp-store
// tmp2-compute
// tmp3-load
pipelineEvent[0]=async_work_group_copy(&b[g*gs],tmp,gs,0);
pipelineEvent[1]=async_work_group_copy(tmp3,&e[g*gs],gs,0);
tmp2[l]=tmp2[l]+3;
wait_group_events(2,&pipelineEvent[0]);
所以spec必須是正確的關於 「由多個異步拷貝共享」。
也許event_t
裏面有個計數器。然後通過1也許
async_work_group_copy
增量它(或由N =每組工作項的數目)
- 當異步完整,調度器1(或每個工作項遞減1)
wait_group_events
檢查計數器遞減它爲零
因此,如果使用90個事件或單個事件(並且不推測更多),則無關緊要。
但是,如果一個接近「也可以用來關聯」部分在臨規範推測,
如果實現只是交錯指令做了「異步」:
multiple events for multiple async copies
copy1 calculate copy2 calculate copy1 calculate copy2 calculate copy1
single event for multiple async copies(grouped copies)
copy1 copy2 calculate copy1 copy2 calculate copy1 copy2 calculate
當拷貝在每次異步迭代中被分組和檢查(反對完成)一次而不是兩次時,等待屏障可以更好地粒度化。
如果實現執行復制同時異步(例如,使用標量流水線用於拷貝在使用SIMD管道用於計算,NCU例如具有2xScalar單元和30xSIMD單元中的每個計算單元):
multiple events for multiple copies
SIMD: compute compute compute compute
scalar-1: copy1 copy1 copy1 copy1
scalar-2: copy2 copy2 copy2 copy2
single event for multiple copies
SIMD: compute compute compute compute
scalar-1:copy1 copy2 copy1 copy2 copy1 copy2
scalar-2: copy1 copy2 copy1 copy2 copy1 copy2
那麼多個事件版本可能會更快,因爲讀取和寫入是在不同的管道上獨立完成的。
CPU,GPU,FPGA可以工作完全不同的,async_work_group_copy
支持阻止我們猜測凝聚的內存使用原語(或它們的載體類型)訪問,所以我會使用的事件處理任何版本,似乎是有用的。