AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / user-17567231

PkDrew's questions

Martin Hope
PkDrew
Asked: 2025-04-16 15:14:27 +0800 CST

Por que o operador ternário não pode ser usado para esta instrução? [duplicado]

  • 6
Esta pergunta já tem respostas aqui :
Por que uma lista de inicialização entre chaves não pode ser usada como uma expressão em um operador condicional? (2 respostas)
Fechado há 20 horas .

Este código me dá erro do compilador: "esperava uma expressão".

std::array< std::string, 3 > candidates = useOutname ? { "%O.log", "%O_.log", "_%O.log" } : { "%J.log", "%J_.log", "_%J.log" };

Se mudar para uma instrução if else simples, funciona:

std::array< std::string, 3 > candidates;
if (useOutname) {
    candidates = { "%O.log", "%O_.log", "_%O.log" };
}
else {
    candidates = { "%J.log", "%J_.log", "_%J.log" };
}

Gostaria de saber por que usar o operador ternário causa erro aqui? É por causa da inicialização das chaves?

c++
  • 1 respostas
  • 160 Views
Martin Hope
PkDrew
Asked: 2025-03-08 13:00:22 +0800 CST

confuso sobre a regra de buffer printf na função global CUDA

  • 6

O código abaixo sempre imprime "Olá do início" antes de qualquer outra coisa, e "Olá do fim" depois de qualquer outra coisa. Por que isso?

Código:

#include <stdio.h>
#include <stdlib.h>
#include <vector>
#include <iostream>

#include "cuda_runtime.h"
#include "device_launch_parameters.h"


__global__ void add1InGPU( int *devArr, int n, int nx )
{
    int ix = blockIdx.x * blockDim.x + threadIdx.x;
    int iy = blockIdx.y * blockDim.y + threadIdx.y;
    int id = nx * iy + ix;

    int whateverNum = 5;

    if (id == whateverNum) printf("Hello from the start\n");
    
    if ( id < n ) {
        devArr[id] += 1; 
        printf("blockIdx.x: %d, threadIdx.x: %d, blockIdx.y: %d, threadIdx.y: %d, processing index %d\n", blockIdx.x, threadIdx.x, blockIdx.y, threadIdx.y, id );
    }
    else {
        printf("blockIdx.x: %d, threadIdx.x: %d, blockIdx.y: %d, threadIdx.y: %d, skipped\n", blockIdx.x, threadIdx.x, blockIdx.y, threadIdx.y);
    }

    if (id == whateverNum) printf("Hello from the end\n");
}

int main(void)
{
    
    int* d_arr = NULL;
    cudaMalloc(&d_arr, 16 * sizeof(int));
    cudaMemset(d_arr, 0, 16 * sizeof(int));

    int nElem = 16;
    dim3 block( 2, 2 );
    dim3 grid( 2, 2 );
    // dim3 grid( ( nElem + block.x - 1 ) / block.x );
    
    add1InGPU<<<grid, block>>> ( d_arr, nElem, 4 );
    cudaDeviceSynchronize();
    int *h_arr = (int*)malloc(16 * sizeof(int));
    cudaMemcpy(h_arr, d_arr, 10 * sizeof(int), cudaMemcpyDeviceToHost);
    cudaFree(d_arr);

    volatile int _ = 0;
    for (int i = 0; i < 10; i++) {
        _ += h_arr[i];
    }

    cudaDeviceReset();
    
    return 0;
}

Saída:

Hello from the start
blockIdx.x: 1, threadIdx.x: 0, blockIdx.y: 0, threadIdx.y: 0, processing index 2
blockIdx.x: 1, threadIdx.x: 1, blockIdx.y: 0, threadIdx.y: 0, processing index 3
blockIdx.x: 1, threadIdx.x: 0, blockIdx.y: 0, threadIdx.y: 1, processing index 6
blockIdx.x: 1, threadIdx.x: 1, blockIdx.y: 0, threadIdx.y: 1, processing index 7
blockIdx.x: 0, threadIdx.x: 0, blockIdx.y: 1, threadIdx.y: 0, processing index 8
blockIdx.x: 0, threadIdx.x: 1, blockIdx.y: 1, threadIdx.y: 0, processing index 9
blockIdx.x: 0, threadIdx.x: 0, blockIdx.y: 1, threadIdx.y: 1, processing index 12
blockIdx.x: 0, threadIdx.x: 1, blockIdx.y: 1, threadIdx.y: 1, processing index 13
blockIdx.x: 1, threadIdx.x: 0, blockIdx.y: 1, threadIdx.y: 0, processing index 10
blockIdx.x: 1, threadIdx.x: 1, blockIdx.y: 1, threadIdx.y: 0, processing index 11
blockIdx.x: 1, threadIdx.x: 0, blockIdx.y: 1, threadIdx.y: 1, processing index 14
blockIdx.x: 1, threadIdx.x: 1, blockIdx.y: 1, threadIdx.y: 1, processing index 15
blockIdx.x: 0, threadIdx.x: 0, blockIdx.y: 0, threadIdx.y: 0, processing index 0
blockIdx.x: 0, threadIdx.x: 1, blockIdx.y: 0, threadIdx.y: 0, processing index 1
blockIdx.x: 0, threadIdx.x: 0, blockIdx.y: 0, threadIdx.y: 1, processing index 4
blockIdx.x: 0, threadIdx.x: 1, blockIdx.y: 0, threadIdx.y: 1, processing index 5
Hello from the end
c++
  • 1 respostas
  • 88 Views
Martin Hope
PkDrew
Asked: 2024-12-22 16:09:27 +0800 CST

Existe alguma diferença entre declarar a palavra-chave "alignas" na definição de struct e no array de definição de struct?

  • 7

Digamos que eu tenha uma estrutura chamada Particlee gostaria que ela fosse alinhada em 32 bits. Devo usar a alignaspalavra-chave quando especificar a definição da estrutura, como no código abaixo:

struct alignas(32) Particle {
    // Total size: 16 bytes, but alignas(32) ensures 32-byte alignment
    float x; // 4 bytes
    float y; // 4 bytes
    float z; // 4 bytes
    float w; // 4 bytes 
};

ou devo especificá-lo na definição dos layouts onde as estruturas residem, assim:

alignas(32) Particle particles[8]; // Array of 8 particles, 32-byte aligned

ou devo fazer as duas coisas?

c
  • 1 respostas
  • 30 Views
Martin Hope
PkDrew
Asked: 2024-12-21 09:08:36 +0800 CST

O que o operador AND '&' faz em "& tee"?

  • 6

No meu ambiente de desenvolvimento, existe um alias que grava stdout em um arquivo específico.

Ele usa tubo com T, por exemplo, du -h | & tee /tmp/diskUsage.

Entendo que o operador AND torna tudo o que precede um descritor de arquivo em vez de um nome de arquivo, por exemplo, 2>&1redirecionando stderr para stdout em vez de um arquivo chamado "1" no diretório atual.

Entretanto, para o uso | & tee, não há nada significativo depois de '&' e antes de "tee", o que isso faz neste caso?

linux
  • 1 respostas
  • 42 Views
Martin Hope
PkDrew
Asked: 2024-12-12 22:15:09 +0800 CST

Os programadores precisam implementar manualmente otimizações, como desdobramento de loop, etc., ao escrever código Python?

  • 6

Recentemente, estou aprendendo alguns tópicos de HPC e descobri que os compiladores C/C++ modernos são capazes de detectar locais onde a otimização é necessária e conduzi-la usando técnicas correspondentes, como SIMD, desdobramento de loop, etc., especialmente sob o sinalizador -O3, com uma compensação entre desempenho de tempo de execução versus tempo de compilação e tamanho do arquivo de objeto.

Então, imediatamente me ocorreu que o CPython interpreta e executa em tempo real, então presumo que ele não pode se dar ao luxo de conduzir esses recursos do compilador porque o tempo de compilação para ele é equivalente ao tempo de execução, então fiz um experimento de brinquedo abaixo:

import time, random

n = 512
A = [[random.random() for _ in range(n)] for _ in range(n)]
B = [[random.random() for _ in range(n)] for _ in range(n)]
C = [[0] * n for _ in range(n)]

def matMul( A, B, C ):
    """ C = A .* B """
    for i in range(0, n - 4, 4):
        for j in range(0, n - 4, 4):
            for k in range(0, n - 4, 4):
                C[i][j] = A[i][k] * B[k][j]
                C[i + 1][j + 1] = A[i + 1][k + 1] * B[k + 1][j + 1]
                C[i + 2][j + 2] = A[i + 2][k + 2] * B[k + 2][j + 2]
                C[i + 3][j + 3] = A[i + 3][k + 3] * B[k + 3][j + 3]
                C[i + 4][j + 4] = A[i + 4][k + 4] * B[k + 4][j + 4]
    # return C

start = time.time()
matMul( A, B, C )
end = time.time()

print( f"Elapsed {end - start}" )

Com o loop se desenrolando, o programa termina em 3 segundos, sem ele, leva até quase 20 segundos.

Isso significa que é preciso prestar atenção e implementar manualmente essas técnicas opt ao escrever código Python? Ou o Python oferece a otimização em alguma configuração especial?

python
  • 2 respostas
  • 102 Views
Martin Hope
PkDrew
Asked: 2024-12-09 18:26:00 +0800 CST

O fork do Linux ao menos copia registradores?

  • 6

Aprendi recentemente que fork aplica COW (copy on write) até mesmo em registradores.

Brinquei com uma caixa de brinquedo simples para verificar:

(gdb) info inferiors
  Num  Description       Connection           Executable
* 1    process 59316     1 (native)           /home/Drew/mycode/a.out
  2    process 59386     1 (native)           /home/Drew/mycode/a.out
(gdb) print( $rdi )
$1 = 18874385
(gdb) set $rdi=42
(gdb) print( $rdi )
$2 = 42
(gdb) inferior 2
[Switching to inferior 2 [process 59386] (/home/Drew/mycode/a.out)]
[Switching to thread 2.1 (process 59386)]
#0  0x00002aaaab090291 in fork () from /lib64/libc.so.6
(gdb) print( $rdi )
$3 = 18874385

Como vocês podem ver, modificar o rdi no proc pai não interfere no proc filho.

Gostaria de saber como isso é feito? As CPUs modernas fornecem múltiplos registradores iguais exclusivamente para multiprocessos?

EDITAR:

Obrigado a vocês, companheiros, por comentarem. Responderei às perguntas nos comentários aqui coletivamente, espero que ajude a esclarecer.

A referência que estou usando é esta nota de aula .

Geralmente quero descobrir:

  • O Linux alguma vez copia os registradores, seja COW ou não?
  • Se a resposta for sim, isso é feito pelo hardware, ou seja, os fabricantes da CPU fornecem suporte de design como fazem para dar suporte a máquinas virtuais, ou pelo software, digamos, o sistema operacional armazena o valor do registro em algum lugar (na RAM?), então, em vez de operar nos próprios registros, ele efetivamente modifica a página, mas de alguma forma consegue imitar o comportamento do registro?
  • Se fork não copia registradores de forma alguma, por que estou vendo o fenômeno no GDB?
c
  • 2 respostas
  • 117 Views
Martin Hope
PkDrew
Asked: 2024-12-01 16:55:30 +0800 CST

Dado um valor duplo x, por que (signed long long)(x) != *(signed long long *)(&x)?

  • 9

Gostaria de saber por que o código abaixo imprime "errado".

double x = 0x8000000000000000;
signed long long v1 = (signed long long)(x);
signed long long v2 = *(signed long long *)(&x);
printf( v1 == v2? "correct\n" : "wrong\n" );

Tentei imprimir a representação binária de v1 e v2 respectivamente pelo código abaixo:

printf( "v1 = 0b" );
for ( int i = 63; i > 0; i-- ) {
    printf( "%d", ( ( v1 >> i ) & 1 ) );
}
printf( "\n" );

printf( "v2 = 0b" );
for ( int i = 63; i > 0; i-- ) {
    printf( "%d", ( ( v2 >> i ) & 1 ) );
}
printf( "\n" );

Acontece que v1 está correto, mas v2 é 0b010000111110000000000000000000000000000000000000000000000000000.

Alguém poderia ser tão gentil em ensinar o que acontece aqui?

Também gostaria de saber se o padrão C oferece alguma maneira de imprimir a representação subjacente de binário ou hexadecimal, de modo que meu esquema de impressão possa ser substituído por uma chamada de função de uma linha?

c
  • 1 respostas
  • 76 Views
Martin Hope
PkDrew
Asked: 2024-11-19 20:11:55 +0800 CST

E se o enésimo iterador não estiver dentro do intervalo [primeiro, último) ao usar std::nth_element

  • 5

Não consigo encontrar nenhuma definição oficial relacionada ao tratamento de std::nth_element(first, nth, last) se nth estiver fora do intervalo [first, last).

Para tentar descobrir, fiz um teste de brinquedo na minha máquina:

std::vector<int> arr{ 7, 3, 9, 6, 4 };
std::nth_element( arr.begin() + 1, arr.begin(), arr.end() );
for (int num : arr) {
    printf("%d", num);
}

O MSVC me dá falha de asserção no código stl src do vetor, dizendo "intervalo do iterador do vetor transposto". É um comportamento indefinido?

c++
  • 1 respostas
  • 59 Views
Martin Hope
PkDrew
Asked: 2024-11-14 21:20:04 +0800 CST

se o valor de um mapa hash também for um contêiner hash, por exemplo, unordered_map<int, unordered_set<...>>, como especificar hash personalizado e equal para o valor?

  • 6

Digamos que agora tenho funções hash e equal prontas para um unordered_set

auto equalFunc = [](...){...};
auto hashFunc  = [](...){...};

Se o unordered_set for usado exclusivamente, sei que posso fazer o seguinte para especificar meu hash DIY e equal:

std::unordered_set<std::pair<int,int>, decltype( hashFunc ), decltype( equalFunc )> mySet( 0, hashFunc, equalFunc );

Entretanto, agora suponha que o unordered_set deve ser usado como valor de std::unordered_map, como posso especificar o hash e o equal?

std::unordered_map<int, std::unordered_set<std::pair<int,int>, decltype( hashFunc ), decltype( equalFunc )>> myMap( ...how? );
c++
  • 2 respostas
  • 56 Views
Martin Hope
PkDrew
Asked: 2024-09-23 09:26:41 +0800 CST

O que o GDB retorna quando imprime &"alguma string literal" para o código-fonte C++?

  • 7

No GDB, posso fazer o seguinte e obter o endereço de uma string literal:

(gdb) p &"aaa"
$3 = (char (*)[4]) 0x614c20

Pelo que entendi, uma string literal é um rvalue sem nenhum símbolo ao qual se vincula, mas por que posso obter seu endereço?

Que tipo de endereço é esse? É algum lugar onde todos os literais de string são armazenados? Mas há literais de string infinitos, isso significa que o literal de string é "criado e colocado na memória" sob demanda?

c++
  • 1 respostas
  • 37 Views
Martin Hope
PkDrew
Asked: 2024-08-24 16:53:51 +0800 CST

O que a sintaxe "in" do Python faz essencialmente? [duplicado]

  • 4
Esta pergunta já tem respostas aqui :
Substituir o operador 'in' do Python? (3 respostas)
Fechado ontem .

Digamos que eu tenha um contêiner arbitrário e uma pergunta para saber se há um elemento nele, veja abaixo.

D = {(1, 2): "whatever"}
if (2, 1) in D:
    print( "Impossible" ) 

O que realmente acontece em termos de código subjacente? alguma função de membro específica, como find(), é chamada?

Além disso, posso usar um cmp/hash personalizado? digamos, se eu quiser comparar apenas a ocorrência de cada número na chave da tupla conforme mostrado no trecho de código, o que posso fazer para conseguir isso?

D = {(1, 2, 1): "whatever"}
if (2, 1, 1) in D:
    print( "As expected" ) # How to make it happen?

Um documento oficial do Py será muito apreciado, presumo que seja uma informação bastante fundamental, mas não consigo encontrar uma introdução oficial em lugar nenhum.

python
  • 2 respostas
  • 46 Views
Martin Hope
PkDrew
Asked: 2024-08-13 16:32:26 +0800 CST

A ligação lenta da biblioteca compartilhada é obtida usando a alocação lenta de memória virtual pelo sistema operacional?

  • 5

No Linux (não tenho certeza para Windows, qualquer conhecimento sobre isso também é apreciado), uma técnica chamada ligação lenta é usada para aumentar o desempenho quando apenas uma pequena parte da biblioteca compartilhada é necessária, imagine quando você invoca um programa com -h --help arg, etc.

Eu queria saber como isso é implementado? está relacionado à técnica de alocação lenta de gerenciamento de memória virtual do sistema operacional? ou seja, em vez de carregar todas as instruções na memória, um mapeamento para a memória não mapeada é conduzido primeiro, e a memória válida é carregada somente quando for realmente necessária/referida durante o tempo de execução.

linux
  • 1 respostas
  • 10 Views

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Reformatar números, inserindo separadores em posições fixas

    • 6 respostas
  • Marko Smith

    Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não?

    • 2 respostas
  • Marko Smith

    Problema com extensão desinstalada automaticamente do VScode (tema Material)

    • 2 respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Martin Hope
    Fantastic Mr Fox Somente o tipo copiável não é aceito na implementação std::vector do MSVC 2025-04-23 06:40:49 +0800 CST
  • Martin Hope
    Howard Hinnant Encontre o próximo dia da semana usando o cronógrafo 2025-04-21 08:30:25 +0800 CST
  • Martin Hope
    Fedor O inicializador de membro do construtor pode incluir a inicialização de outro membro? 2025-04-15 01:01:44 +0800 CST
  • Martin Hope
    Petr Filipský Por que os conceitos do C++20 causam erros de restrição cíclica, enquanto o SFINAE antigo não? 2025-03-23 21:39:40 +0800 CST
  • Martin Hope
    Catskul O C++20 mudou para permitir a conversão de `type(&)[N]` de matriz de limites conhecidos para `type(&)[]` de matriz de limites desconhecidos? 2025-03-04 06:57:53 +0800 CST
  • Martin Hope
    Stefan Pochmann Como/por que {2,3,10} e {x,3,10} com x=2 são ordenados de forma diferente? 2025-01-13 23:24:07 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve