Skip to content

This patch fixes bug #3293 - OpenCL kernel argument problem with some locales #3294

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Nov 21, 2022

Conversation

GuillaumeSchmid
Copy link
Contributor

Short Description:

There is a problem when the locale is non C when rendering the arguments to OpenCL kernels.

Short description of the change:

The patch is pretty simple, it changes the toString() function to use the stringstream imbued with C locale in src/backend/common/TemplateArg.cpp and changed the to_string calls to this toString function in types.cpp.

Description

The arguments provided to OpenCL uses the C++ standard library function std::to_string(). This function uses the locale to render it's argument to a string.

It is a problem when arrayfire is used in a
software initialised with non "C" locale.

For instance, on a French computer, to_string(1.0) will output the string "1,0000000".
This string is provided to OpenCL kernels, generating a syntax error.

The most portable way to fix this problem is to use a local ostringstream imbued withe "C" locale.

An Other way would be to use C++17 to_chars function, as it only renders it argument with "C" locale, without impact from the application or system locale.
I did not use this latest solution as it would force the use of C++17.

  • [ yes] Rebased on latest master
  • [yes ] Code compiles
  • [yes] Tests pass
  • [no ] Functions added to unified API
  • [no ] Functions documented

@syurkevi syurkevi requested a review from umar456 November 9, 2022 22:14
@umar456 umar456 force-pushed the toString_C_locale branch 2 times, most recently from 1dc3a33 to 7ab1bf8 Compare November 16, 2022 18:43
umar456
umar456 previously approved these changes Nov 16, 2022
@umar456 umar456 force-pushed the toString_C_locale branch 2 times, most recently from 0135aa2 to 49e8f03 Compare November 16, 2022 23:26
The arguments provided to OpenCL uses the C++ standard library
function std::to_string(). This function uses the locale to render
it's argument to a string.

It is a problem when arrayfire is used in a
software initialised with non "C" locale.

For instance, on a French computer, to_string(1.0) will output the
string "1,0000000".
This string is provided to OpenCL kernels, generating a syntax error.

The most portable way to fix this problem is to use a local ostringstream
imbued withe "C" locale.

An Other way would be to use C++17 to_chars function, as it only renders it
argument with "C" locale, without impact from the application or
system locale.

The patch is pretty simple, it changes the toString() function to use
the stringstream in src/backend/common/TemplateArg.cpp and changed the
to_string calls to this toString function in types.cpp.
@umar456
Copy link
Member

umar456 commented Nov 18, 2022

@GuillaumeSchmid I made some changes to your PR to address a couple of other issues related to the structure of the codebase. Could you give these changes another try to see if addresses the issue you are seeing. I was able to incorporate the to_chars feature suggested in your comment.

@GuillaumeSchmid
Copy link
Contributor Author

@umar456 I tested your implementation with to_char on my code, it works.

@umar456 umar456 merged commit 5a11efe into arrayfire:master Nov 21, 2022
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

2 participants