2014-10-11 37 views
1

我有大約4000個具有3000個維度的向量,我需要明智地計算差異向量對。每個嵌套for for循環的並行

這裏來的問題。 我嘗試了兩種方式。

differ = (double *)malloc(sizeof(double) * testNum * trainNum * featureDim); 
array_view<double, 2> differAMP(testNum, trainNum, featureDim, differ); 
QueryPerformanceFrequency(&tc); 
QueryPerformanceCounter(&t1); 
parallel_for_each(
     differAMP.extent, 
     [=](concurrency::index<3> idx) restrict(amp) { 
     differAMP[idx] = (test(idx[0], idx[2]) - train(idx[1], idx[2])); 
} 
); 

但是vs vs引發了一個運行時異常,因爲內存限制,我想。 然後我改變了代碼

differ = (double *)malloc(sizeof(double) trainNum * featureDim); 
array_view<double, 2> differAMP(trainNum, featureDim, differ); 
QueryPerformanceFrequency(&tc); 
QueryPerformanceCounter(&t1); 
parallel_for_each(
     differAMP.extent, 
     [=](concurrency::index<2> idx) restrict(amp) { 
     differAMP[idx] = (test(testIndex, idx[1]) - train(idx[0], idx[1])); 
} 
); 

我運行此爲一個循環內的每個測試用例。 但是,vs拋出一個array_view移除了異常。 現在我不知道該怎麼辦。

+0

調用'differAMP.synchronize()'? – Jamboree 2014-10-11 07:33:25

+0

哪裏?第二個代碼後? – 2014-10-11 07:47:17

+0

我需要更多的上下文來回答這個問題。異常發生在何處/何時?在parallel_for_each完成後訪問'differAMP'的代碼在哪裏? – 2014-10-13 18:30:11

回答

0

在第一種情況下,您因內存不足而失敗。在第二種情況下,您可能會失敗,因爲您的任務超過了2秒的TDR限制。請記住,parallel_for_each將工作異步排隊到GPU的DMA緩衝區。因此,在一個循環for放置這將導致所有的

for (int testIndex = 0; testIndex < testNum; ++testIndex) 
{ 
    differ = (double *)malloc(sizeof(double) trainNum * featureDim); 
    array_view<double, 2> differAMP(trainNum, featureDim, differ); 
    QueryPerformanceFrequency(&tc); 
    QueryPerformanceCounter(&t1); 
    parallel_for_each(
     differAMP.extent, 
     [=](concurrency::index<2> idx) restrict(amp) { 
     differAMP[idx] = (test(testIndex, idx[1]) - train(idx[0], idx[1])); 
    }); 

    // Force this parallel_for_each to finish before running the next one. 
    differAmp.source_accelerator_view.wait(); 
} 

上述代碼防止所有排隊且在一個塊引起TDR超時這將拋出異常執行的工作。

您還可以通過創建具有特定排隊模式的視圖來改變排隊行爲。立即模式強制任務立即排隊,以吞吐量爲代價提高延遲。

accelerator acc(accelerator::default_accelerator); 
acc.create_view(queuing_mode::queuing_mode_immediate);