У меня есть кусок кода для параллельного хеширования, код вставки следующим образом:Parallel хеширования с использованием OpenMP
int main(int argc, char** argv){
.....
Entry* table;//hash table
for(size_t i=0;i<N;i++){
keys[i]=i;
values[i] = rand();//random key-value pairs
}
int omp_p = omp_get_max_threads();
#pragma omp parallel for
for(int p=0;p<omp_p;p++){
size_t start = p*N/omp_p;
size_t end = (p+1)*N/omp_p;//each thread gets contiguous chunks of the arrays
for(size_t i=start;i<end;i++){
size_t key = keys[i];
size_t value = values[i];
if(insert(table,key,value) == 0){
printf("Failure!\n");
}
}
}
....
return 0;
}
int insert(Entry* table,size_t key, size_t value){
Entry entry = (((Entry)key) << 32)+value; //Coalesce key and value into an entry
/*Use cuckoo hashing*/
size_t location = hash_function_1(key);
for(size_t its=0;its<MAX_ITERATIONS;its++){
entry = __sync_lock_test_and_set(&table[location],entry);
key=get_key(entry);
if(key == KEY_EMPTY)
return1;
}
/*We have replaced a valid key, try to hash it using next available hash function*/
size_t location_1 = hash_function_1(key);
size_t location_2 = hash_function_2(key);
size_t location_3 = hash_function_3(key);
if(location == location_1) location = location_2;
else if(location == location_2) location = location_3;
else location = location_1;
}
return 0;
}
код Вкладыш не масштабируется на всех. Если я использую один поток, например, ключи 10M, я завершаю около 170 мс, тогда как используя 16 потоков, я беру> 500 мс. Мое подозрение в том, что это связано с тем, что строка кэша (состоящая из массива table []) перемещается между потоками во время операции записи (__sync_lock_test_and_set (...)), а результат недействительности замедляется Например, если Я изменяю код вставки только:
int insert(Entry* table,size_t key, size_t value){
Entry entry = (((Entry)key) << 32)+value; //Coalesce key and value into an entry
size_t location = hash_function_1(key);
table[location] = entry;
return 1;
}
Я все еще получаю такое же плохое представление. Поскольку это хэширование, я не могу контролировать, где хэшируется конкретный элемент. Итак, любые предложения? Кроме того, если это неправильная причина, любые другие указатели на то, что может пойти не так? Я пробовал его с 1M до 100M ключей, но однопоточная производительность всегда лучше.
Есть ли какая-либо причина вручную назначить кусок для потоков (вместо этого это сделать OpenMP)? – Massimiliano
Я получаю немного лучшие результаты, хотя производительность одного ядра по-прежнему поражает меня плохо – user1715122
Я не понимаю, почему ... Вы делите массив, как 'static'. Кроме того, массив доступен только для чтения в многопоточной части вашего кода. – Massimiliano