Мое ядро довольно простое. Он пытается увидеть, если коды являются действительными, а затем сохраняют только уникальные коды в соответствии с выходными сканирования приставки:OpenCL - ядро работает медленно
__kernel void moveValid(__global int* sortCode, __global int* mark, __global int* processorOffsets, __global int* uniqueCode,__global int* numPoints, __global int* pointIndex)
{
int ig = get_global_id(0);
int m = mark[ig];
int j= processorOffsets[ig];
atomic_inc(&numPoints[j-1]);
// select
if(m == true)
{
uniqueCode[j] = sortCode[ig];
pointIndex[j] = ig;
}
barrier(CLK_GLOBAL_MEM_FENCE);
}
Похоже, что ядро очень медленно. Это связано с утверждением if? Может ли кто-нибудь дать советы о том, как можно улучшить ядро? Также можно выбрать использование в этом сценарии?
спасибо. Я все еще не совсем уверен, где поставить барьер в ядро и когда. Я изменил atom_inc на локальную память. Ядро работает быстрее. – shunyo
Обычно вам не нужен барьер. Барьеры будут необходимы только тогда, когда вы выполняете работу, а затем хотите дождаться своей рабочей_группы, а затем выполните больше работы. Кроме того, вполне вероятно, что барьер не работает так, как вы думаете. Если вам нужен глобальный барьер (например, тот же объем работы, выполняемый каждой рабочей группой), то делайте это через выполнение ядра вместо использования барьера. Также убедитесь, что вы понимаете различия между различными воспоминаниями (глобальными, локальными, частными), а не просто используете их. – KLee1