OpenCL: может ли умножение на число с плавающей точкой вызвать внутреннюю ошибку?

Я пытаюсь использовать OpenCL (Java-упаковщик, используя Eclipse) для выполнения ряда вычислений на некоторых данных. Само ядро ​​не содержит расчетов; вместо этого он вызывает другие функции для выполнения работы.

Теперь есть одна функция, которая кажется недействительной или что-то в этом роде. Это работает нормально:

int scaled(floatMemory fMem, int a, float b){
    int result = indexAlloc(fMem);
    float a0 = getf(fMem,a,0);
    float a1 = getf(fMem,a,1);
    float a2 = getf(fMem,a,2);
    setf(fMem, result, a0, a1, a2);
    return 0;
}

Однако этот код вызывает внутреннюю ошибку (см. Предпоследний оператор):

int scaled(floatMemory fMem, int a, float b){
    int result = indexAlloc(fMem);
    float a0 = getf(fMem,a,0);
    float a1 = getf(fMem,a,1);
    float a2 = getf(fMem,a,2);
    setf(fMem, result, a0*b, a1*b, a2*b);
    return 0;
}

Я попробовал некоторые другие логические тесты, и я понял, что что-то не так со значением с плавающей запятой 'b' (т.е. бесконечным или нулевым). Кто-нибудь может проверить это для меня?

PS: это то, что напечатано в консоли:

#
# A fatal error has been detected by the Java Runtime Environment:
#
#  EXCEPTION_ACCESS_VIOLATION (0xc0000005) at pc=0x5a619b14, pid=7416, tid=12112
#
# JRE version: 7.0_25-b16
# Java VM: Java HotSpot(TM) Client VM (23.25-b01 mixed mode, sharing windows-x86 )
# Problematic frame:
# C  [igdbcl32.dll+0x79b14]  Delete+0x78a94
#
# Failed to write core dump. Minidumps are not enabled by default on client versions of Windows
#
# An error report file with more information is saved as:
# ~:\~\~\~\~\~\bin\hs_err_pid7416.log
#
# If you would like to submit a bug report, please visit:
#   http://bugreport.sun.com/bugreport/crash.jsp
# The crash happened outside the Java Virtual Machine in native code.
# See problematic frame for where to report the bug.
#

1 ответ

Решение

Извините, это немного поздно, но, возможно, это может кому-то помочь.

Оказывается, я пытался вернуть float, который был освобожден после выхода из функции, например:

float sum(float a, float b) {
float x = a+b;
return x;
}

Переменная x не существует вне функции, поэтому, когда я попытался получить к ней доступ из функции вызывающего, я получил ошибку. Решение состояло в том, чтобы настроить мой собственный буфер (боль в заднице), чтобы переменные сохраняли целостность во всем потоке.

Другие вопросы по тегам