- 论坛徽章:
- 0
|
本帖最后由 cobranail 于 2010-03-10 20:52 编辑
OpenMP
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))
int main (int argc, const char * argv[]) {
const int N = 1000;
const int BLURRADIUS = 7;
float originalImage[N*N], blurredImage[N*N];
int row, col, i, j;
#pragma omp parallel for private (col, i, j)
for ( row = 0; row < N; ++row ) {
for ( col = 0; col < N; ++col ) {
int pixIndex = row*N + col;
blurredImage[pixIndex] = 0.0f;
for ( i = MAX(0, row-BLURRADIUS); i < MIN(row+BLURRADIUS, N); ++i ) {
for ( j = MAX(0, col-BLURRADIUS); j < MIN(col+BLURRADIUS, N); ++j ) {
int blurPixIndex = i*N + j;
float distance = (i-row)*(i-row) + (j-col)*(j-col);
distance = sqrt(distance);
blurredImage[pixIndex] += exp(-distance*distance) * originalImage[blurPixIndex];
}
}
}
}
return 0;
}
grand central
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <dispatch/dispatch.h>
#define MAX(a, b) ((a) > (b) ? (a) : (b))
#define MIN(a, b) ((a) < (b) ? (a) : (b))
int main (int argc, const char * argv[]) {
const int N = 1000;
const int BLURRADIUS = 7;
float originalImage[N*N], blurredImage[N*N];
dispatch_queue_t queue = dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0);
dispatch_apply(N, queue,
^(size_t row) {
int col, i, j;
for ( col = 0; col < N; ++col ) {
int pixIndex = row*N + col;
blurredImage[pixIndex] = 0.0f;
for ( i = MAX(0, row-BLURRADIUS); i < MIN(row+BLURRADIUS, N); ++i ) {
for ( j = MAX(0, col-BLURRADIUS); j < MIN(col+BLURRADIUS, N); ++j ) {
int blurPixIndex = i*N + j;
float distance = (i-row)*(i-row) + (j-col)*(j-col);
distance = sqrt(distance);
blurredImage[pixIndex] += exp(-distance*distance) * originalImage[blurPixIndex];
}
}
}
}
);
return 0;
}
好像差不多,这个应该只是grand central的副业,主业应该还是想取代pthread。我比较喜欢grand central,因为不用锁。
貌似grand central还可以把任务发送到opencl设备上。
freebsd 8.1将支持block和grand central dispatch,不知道性能怎么样。 |
|