Я увидел реализацию smallpt в OpenCL, и автор использует свои собственные типы векторов и макропроцессоры prepocessor в ядре.Использование собственного векторного типа в OpenCL кажется более быстрым
typedef struct { float x, y, z; } Vec;
#define vinit(v, a, b, c) { (v).x = a; (v).y = b; (v).z = c; }
#define vsmul(v, a, b) { float k = (a); vinit(v, k * (b).x, k * (b).y, k * (b).z) }
#define vdot(a, b) ((a).x * (b).x + (a).y * (b).y + (a).z * (b).z)
#define vnorm(v) { float l = 1.f/sqrt(vdot(v, v)); vsmul(v, l, v); }
and much more...
Я проверил код и заменил определяемые пользователем типы векторов и операции стандартным встроенным типом float3. Я был удивлен, что оригинальная реализация автора была на 10 кадров быстрее, чем вариант со встроенным float3. После этого я немного протестировал ситуацию с Intel OpenCL Applications Kernel Builder и, похоже, подтвердил, что встроенные функции работают медленнее.
Любые идеи, почему? Поставщики рекомендуют типы встроенных типов:/
На каком языке это? В C или C++ нет встроенного типа 'float3'. –
Как выглядит ваш тестовый код? На каком оборудовании вы работаете? –
Это OpenCL C на основе стандарта C99 для программирования GPGPU. Контрольный код состоял в том, чтобы просто выполнить некоторые базовые векторные операции более миллиона раз и сравнить их с пользовательской версией. (норма, крест, точка, добавить, mull, ...) Оборудование для тестирования было Intel i7-3630QM (Intel HD 4000 не работал в построителе ядра). И код smallpt работает на моем nvidia quadro gpu (NVS 5200M) И вот оригинальная реализация opptl smallpt opencl http://www.phoronix-test-suite.com/benchmark-files/SmallptGPU-v1.6pts-1. tar.bz2 – Erabong