float の配列で最大要素を見つける関数の 2 つのバージョンを実装しようとしています。ただし、私の並列関数は、シリアル コードよりもはるかに遅く実行されているように見えました。
4194304 (2048 * 2048) float の配列を使用すると、次の数値 (マイクロ秒単位) が得られます。
シリアルコード:9433
PPL コード: 24184 ( 2 倍以上遅い)
OpenMP コード: 862093 (ほぼ100倍遅い)
コードは次のとおりです。
PPL:
float find_largest_element_in_matrix_PPL(float* m, size_t dims)
{
float max_element;
int row, col;
concurrency::combinable<float> locals([] { return (float)INT_MIN; });
concurrency::parallel_for(size_t(0), dims * dims, [&locals](int curr)
{
float &localMax = locals.local();
localMax = max<float>(localMax, curr);
});
max_element = locals.combine([](float left, float right) { return max<float>(left, right); });
return max_element;
}
OpenMP:
float find_largest_element_in_matrix_OMP(float* m, unsigned const int dims)
{
float max_value = 0.0;
int i, row, col, index;
#pragma omp parallel for private(i) shared(max_value, index)
for (i = 0; i < dims * dims; ++i)
{
#pragma omp critical
if (m[i] > max_value)
{
max_value = m[i];
index = i;
}
}
//row = index / dims;
//col = index % dims;
return max_value;
}
コードの実行速度が遅い原因は何ですか? 何か不足していますか?
私が間違っていることを見つけるのを手伝ってもらえますか?