openmp에 대한 많은 경험이 없습니다.루프 및 포인터 용 OpenMP
인덱스 대신 for 루프 포인터를 사용하여 다음 코드를 더 빠르게 만들 수 있습니까?
다음 코드를 더 빨리 만들 수 있습니까?
코드는 배열에 상수를 곱합니다.
감사합니다.
코드 :
size_t size_sq = vec.size();
float * ptr = vec.data();
#pragma omp parallel
{
#pragma omp for
for(size_t i = 0; i < size_sq; i++){
ptr[i] *= scalar;
}
}
ptr
은 그래서 아무 문제가 모든 스레드에 대해 동일합니다 같은
#include <iostream>
#include <stdlib.h>
#include <stdint.h>
#include <vector>
using namespace std;
int main(void){
size_t dim0, dim1;
dim0 = 100;
dim1 = 200;
std::vector<float> vec;
vec.resize(dim0*dim1);
float scalar = 0.9;
size_t size_sq = dim0*dim1;
#pragma omp parallel
{
#pragma omp for
for(size_t i = 0; i < size_sq; ++i){
vec[i] *= scalar;
}
}
}
시리얼 포인터 루프는
float* ptr_start = vec.data();
float* ptr_end = ptr_start + dim0*dim1;
float* ptr_now;
for(ptr_now = ptr_start; ptr_now != ptr_end; ++ptr_now){
*(ptr_now) *= scalar;
}
루프에는 20,000 개의 값만 있고 CPU 동기화에는 약간의 오버 헤드가 있습니다. 루프의 속도와 OMP가없는 속도를 측정 했습니까? 그 결과를 공유 할 수 있습니까? –
실제 배열은이 배열보다 훨씬 큽니다. 나는 또한 내가 다른 곳에서도 openmp를 사용할 것이기 때문에 내가 성능을 해치는 일을했는지 알고 싶다. – rxu
실제로 생성 된 코드는 작성한 코드와 다를 수 있습니다. 모든 최적화 된 릴리즈 프로그램을 분해 했습니까? 추신 : OpenMP에서'size_t '를 인덱스 유형으로 사용할 수 있습니까? – ilotXXI