-
Notifications
You must be signed in to change notification settings - Fork 14
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
Create String concatenation <> SIMD function #102
Labels
Projects
Milestone
Comments
I implemented it but it is much slower than Kernel.<>... static
ERL_NIF_TERM concat_1(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
if(__builtin_expect(argc != 2, false)) {
return enif_make_badarg(env);
}
ERL_NIF_TERM left = argv[0];
ErlNifBinary left_binary;
if(__builtin_expect(!enif_inspect_binary(env, left, &left_binary), false)) {
return enif_make_badarg(env);
}
ERL_NIF_TERM right = argv[1];
ErlNifBinary right_binary;
if(__builtin_expect(!enif_inspect_binary(env, right, &right_binary), false)) {
return enif_make_badarg(env);
}
ErlNifBinary object_binary;
if(__builtin_expect(!enif_alloc_binary(left_binary.size + right_binary.size, &object_binary), false)) {
return enif_make_badarg(env);
}
memcpy(object_binary.data, left_binary.data, left_binary.size);
memcpy(object_binary.data + left_binary.size, right_binary.data, right_binary.size);
return enif_make_binary(env, &object_binary);
}
static
ERL_NIF_TERM concat_2(ErlNifEnv *env, int argc, const ERL_NIF_TERM argv[])
{
if(__builtin_expect(argc != 2, false)) {
return enif_make_badarg(env);
}
ERL_NIF_TERM left = argv[0];
ErlNifBinary left_binary;
if(__builtin_expect(!enif_inspect_binary(env, left, &left_binary), false)) {
return enif_make_badarg(env);
}
ERL_NIF_TERM right = argv[1];
ErlNifBinary right_binary;
if(__builtin_expect(!enif_inspect_binary(env, right, &right_binary), false)) {
return enif_make_badarg(env);
}
ErlNifBinary object_binary;
if(__builtin_expect(!enif_alloc_binary(left_binary.size + right_binary.size, &object_binary), false)) {
return enif_make_badarg(env);
}
unsigned char *ptr = object_binary.data;
#pragma clang loop vectorize_width(loop_vectorize_width)
for(unsigned i = 0; i < left_binary.size; i++) {
*ptr++ = left_binary.data[i];
}
for(unsigned i = 0; i < right_binary.size; i++) {
*ptr++ = right_binary.data[i];
}
return enif_make_binary(env, &object_binary);
}
|
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Create the following functions:
And also compare and evaluate execution time.
branch is
string_concat
The text was updated successfully, but these errors were encountered: