2017-03-17 55 views
1

我說得對,從1.1的OpenCL標準(部分10年6月11日)以下的報價「分組」幾個async_work_group_copy()與一個單一的事件

事件參數也可以用來調用將 async_work_group_copy與之前的異步副本相關聯允許多個異步副本共享 的事件;

意味着我可以「組」幾個async_work_group_copy()電話與一個單一的事件和只使用該事件等待整個羣組複製操作完成的

備註:看來,在博客帖子下面的代碼片段爲using_local()內核做到這些? https://streamcomputing.eu/blog/2014-06-19/using-async_work_group_copy-on-2d-data/

回答

2

在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支持阻止我們猜測凝聚的內存使用原語(或它們的載體類型)訪問,所以我會使用的事件處理任何版本,似乎是有用的。