2014-10-11 125 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);