Каковы текущие наилучшие варианты для параллелизации интенсивного ЦП приложения.NET? [закрытый]

Насколько я вижу, нет способа привести статическую функцию-член к указателю на функцию-член, чтобы разрешить перегрузку универсальным способом или любым другим прямым подходом.
Получение подсказки от Jarod42 дает следующее решение с косвенным обращением через некоторый прокси-класс, функцию или в данном случае лямбду (если оно не захватывает):

#include 


using namespace std;


struct A {
    int mem(int a) {
        return a * 2;
    };
    int mem(int a, int b) {
        return a + b;
    }
    static int stat(int a) {
        return a * 2;
    }
    static int stat(int a, int b) {
        return a + b;
    }
};


static A a;


int main() {
    typedef int(*type1)(int);
    typedef int(*type2)(int, int);

    cout << "a.mem(1) -> " << a.mem(1) << endl;
    cout << "a.mem(1, 2) -> " << a.mem(1, 2) << endl;
    cout << "A::stat(1) -> " << A::stat(1) << endl;
    cout << "A::stat(1, 2) -> " << A::stat(1, 2) << endl;
    cout << "a.stat(1) -> " << a.stat(1) << endl;
    cout << "a.stat(1, 2) -> " << a.stat(1, 2) << endl;

    cout << "----------------------------------" << endl;

    type1 aMem1 = [] (int a0) -> int { return a.mem(a0); };
    cout << "aMem1(1) -> " << aMem1(1) << endl;
    type2 aMem2 = [] (int a0, int a1) -> int { return a.mem(a0, a1); };
    cout << "aMem2(1, 2) -> " << aMem2(1, 2) << endl;
    type1 stat1 = [] (int a0) -> int { return A::stat(a0); };
    cout << "stat1(1) -> " << stat1(1) << endl;
    type2 stat2 = [] (int a0, int a1) -> int { return A::stat(a0, a1); };
    cout << "stat2(1, 2) -> " << stat2(1, 2) << endl;
    type1 aStat1 = [] (int a0) -> int { return a.stat(a0); };
    cout << "aStat1(1) -> " << aStat1(1) << endl;
    type2 aStat2 = [] (int a0, int a1) -> int { return a.stat(a0, a1); };
    cout << "aStat2(1, 2) -> " << aStat2(1, 2) << endl;

    return 0;
}

См. live [111 ] пример.

Это позволяет использовать исходную проблему, используя то же соглашение о вызовах, что и для пользователя. Это означает, что если пользователь может вызывать функцию-член (статическую или нет) таким образом, мы также используем то же соглашение о вызовах. Можно использовать указатели на функции-члены, используя вместо этого прокси-класс. Для меня лямбда-подход работал лучше.

18
задан 4 August 2008 в 16:30
поделиться

5 ответов

Ваш первый шаг должен найти и понять параллелизм в Вашей проблеме. Действительно легко написать многопоточный код, который работает не лучше, чем однопоточный код, который это заменяет. "Шаблоны для Параллельного программирования" (Amazon) являются большим введением в ключевые понятия.

, После того как у Вас есть осуществимый дизайн, начните читать статьи в теме "Параллелизма" в архивах MSDN Magazine (ссылка) , особенно что-либо записанное Jeff Richter. Они дадут Вам, основной материал на поточной обработке создает характерный для Windows и.NET. (Раздел многопоточности в "CLR Richter через C# (Amazon) короток, но очень проницателен - настоятельно рекомендованный.)

9
ответ дан 30 November 2019 в 09:15
поделиться

Существуют некоторые параллельные расширения.NET, которые в настоящее время находятся в тестировании и доступны в Microsoft Центр разработки Параллельных вычислений . У них есть несколько интересных объектов, которые Вы ожидали бы как Параллель foreach и параллельная версия LINQ под названием PLINQ. Часть лучшей информации о расширениях находится на Канал 9 .

5
ответ дан 30 November 2019 в 09:15
поделиться

Я думаю, что мы могли также включать подходы non-.NET-specific к параллельной обработке, если это среди наилучших вариантов рассмотреть.

1
ответ дан 30 November 2019 в 09:15
поделиться

@Larsenal

, Если Вы хотите перейти за пределами.NET, был большой дискуссией о Intel Стандартные блоки Поточной обработки , который является параллельной библиотекой для C++.

1
ответ дан 30 November 2019 в 09:15
поделиться

Существует много опций, и лучшее решение будет зависеть от природы проблемы, которую Вы пытаетесь решить. При попытке решить смущающе параллельный , то проблема, затем делящаяся и параллелизирующая задачи, будет тривиальна. В этом случае проблема прибудет в распределение и управление используемыми данными.

Некоторые предложения были бы:

0
ответ дан 30 November 2019 в 09:15
поделиться
Другие вопросы по тегам:

Похожие вопросы: