使用 OpenMP 添加 GPU 阵列
GPU array addition using OpenMP
我正在尝试使用 nvidia GPU 进行 OpenMP 卸载,我正在尝试用它在 C++ 中进行一些数组计算。
现在我的输出并不理想,因为我是使用 OpenMP 进行卸载计算的新手。如果有人能指出正确的方向,我将不胜感激。
代码片段:
#include <omp.h>
#include <iostream>
using namespace std;
int main(){
int totalSum, ompSum;
const int N = 1000;
int array[N];
for (int i=0; i<N; i++){
array[i]=i;
}
#pragma omp target
{
#pragma omp parallal private(ompSum) shared(totalSum)
{
ompSum=0;
#pragma omp parallel for
for (int i=0; i<N; i++){
ompSum += array[i];
}
#pragma omp critical
totalSum += ompSum;
}
printf ( "Caculated sum should be %d but is %d\n", N*(N-1)/2, totalSum );
}
return 0;
}
现在,我知道总和应该计算为一个数字 499500,但是我的机器正在输出非常大的数字,这些数字也是负数。
尝试这样做。
int totalSum=0, ompSum=0 ;
您在 OpenMP 构造函数上有一些拼写错误,即:
- #pragma omp parallal -> #pragma omp parallel;
- #pragma omp parallel for -> #pragma omp for
关于 2. 您不需要 parallel
因为您已经在平行区域内。
尝试以下操作:
using namespace std;
int main(){
int totalSum = 0, ompSum = 0;
const int N = 1000;
int array[N];
for (int i=0; i<N; i++){
array[i]=i;
}
#pragma omp target
{
#pragma omp parallel private(ompSum) shared(totalSum)
{
ompSum=0;
#pragma omp for
for (int i=0; i<N; i++){
ompSum += array[i];
}
#pragma omp critical
totalSum += ompSum;
}
printf ( "Caculated sum should be %d but is %d\n", N*(N-1)/2, totalSum );
}
return 0;
}
我正在尝试使用 nvidia GPU 进行 OpenMP 卸载,我正在尝试用它在 C++ 中进行一些数组计算。
现在我的输出并不理想,因为我是使用 OpenMP 进行卸载计算的新手。如果有人能指出正确的方向,我将不胜感激。
代码片段:
#include <omp.h>
#include <iostream>
using namespace std;
int main(){
int totalSum, ompSum;
const int N = 1000;
int array[N];
for (int i=0; i<N; i++){
array[i]=i;
}
#pragma omp target
{
#pragma omp parallal private(ompSum) shared(totalSum)
{
ompSum=0;
#pragma omp parallel for
for (int i=0; i<N; i++){
ompSum += array[i];
}
#pragma omp critical
totalSum += ompSum;
}
printf ( "Caculated sum should be %d but is %d\n", N*(N-1)/2, totalSum );
}
return 0;
}
现在,我知道总和应该计算为一个数字 499500,但是我的机器正在输出非常大的数字,这些数字也是负数。
尝试这样做。
int totalSum=0, ompSum=0 ;
您在 OpenMP 构造函数上有一些拼写错误,即:
- #pragma omp parallal -> #pragma omp parallel;
- #pragma omp parallel for -> #pragma omp for
关于 2. 您不需要 parallel
因为您已经在平行区域内。
尝试以下操作:
using namespace std;
int main(){
int totalSum = 0, ompSum = 0;
const int N = 1000;
int array[N];
for (int i=0; i<N; i++){
array[i]=i;
}
#pragma omp target
{
#pragma omp parallel private(ompSum) shared(totalSum)
{
ompSum=0;
#pragma omp for
for (int i=0; i<N; i++){
ompSum += array[i];
}
#pragma omp critical
totalSum += ompSum;
}
printf ( "Caculated sum should be %d but is %d\n", N*(N-1)/2, totalSum );
}
return 0;
}