Цикл ожидания кажется неоптимальным. Помимо горящих ядер, которые ожидают вращения, вам также понадобится множество хорошо расположенных директив flush
, чтобы этот код работал.
Одной из альтернатив, особенно в контексте более общей схемы распараллеливания, было бы использование задач и зависимостей задач для моделирования зависимостей между различными элементами массива:
#pragma omp parallel
#pragma omp single
for (i=1; i<lenx; i++) {
for (j=1; j<leny; j++) {
#pragma omp task depend(in:A[i-1][j-1],A[i-1][j],A[i][j-1]) depend(out:A[i][j])
A[i][j] = max(A[i-1][j-1]+1,A[i-1][j]-1, A[i][j-1] -1);
}
}
Возможно, вы захотите подумать о блоке матрица обновляется, так что каждая задача получает блок матрицы вместо одного элемента, но общая идея останется прежней.
Еще одна полезная функция OpenMP могла бы быть конструкцией ordered
, и она способна придерживаться именно такой зависимости данных:
#pragma omp parallel for
for (int i=1; i<lenx; i++) {
for (int j=1; j<leny; j++) {
#pragma omp ordered depend(source)
#pragma omp ordered depend(sink:i-1,j-1)
A[i][j] = max(A[i-1][j-1]+1,A[i-1][j]-1, A[i][j-1] -1);
}
}
PS: приведенный выше код не проверен, но он должен получить грубую идея поперек.
Не беспокойтесь о проверке.
queue.declare является идемпотентной операцией. Так что, если вы запустите его один раз, два раза, N раз, результат останется прежним.
Если вы хотите убедиться, что очередь существует, просто объявите ее перед использованием. Убедитесь, что вы объявляете его с одинаковой долговечностью, эксклюзивностью, автоматическим удалением каждый раз, иначе вы получите исключение.
Если вам действительно нужно проверить, существует ли очередь (обычно это не нужно), сделайте пассивное объявление очереди. Эта операция завершается успешно, если очередь существует, или приводит к ошибке, если она не существует.
Существует meta API пружиной-amqp (реализация Java)
@Autowired
public RabbitAdmin rabbitAdmin;
//###############get you queue details##############
Properties properties = rabbitAdmin.getQueueProperties(queueName);
//do your custom logic
if( properties == null)
{
createQueue(queueName);
}